список повторяющихся кортежей в csv python

#python #csv

#python #csv

Вопрос:

Я пытаюсь выучить python, я написал код для преобразования списка повторяющихся кортежей в csv. Я не могу получить нужный мне результат

Имена строк должны быть динамическими независимо от того, сколько когда-либо было плодов.

 import csv

csvData = [('apple', '2'), ('banana', '10'), ('apple', '21'), ('banana', '24'),('pears','10'),('pears','30')]

with open('person.csv', 'w') as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(csvData)

csvFile.close()][1]][1]
  

Я получаю вывод следующим образом

введите описание изображения здесь

Вместо этого я хочу, чтобы результат выглядел следующим образом

введите описание изображения здесь

Ответ №1:

Чтобы получить желаемый результат, вам нужно преобразовать ваш ввод в

 csvData = [('apple', '2'), ('banana', '10'), ('apple', '21'), 
           ('banana', '24'), ('pears','10'),('pears','30')]
  

использование python для списка, структурированного следующим образом:

 new_data = [('apple', 'banana', 'pears'),     # row 0
            ('2','10','10'),                  # row 1
            ('21','24','30')]                 # row 2   of your outputfile
  

Если вы передадите это в

 import csv

with open("fruits.csv", "w", newline ="" ) as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(new_data)

print(open("fruits.csv").read())
  

Вы получаете желаемый результат:

 apple,banana,pears
2,10,10
21,24,30
  

Вам нужно добавить newline ="" к вашему вызову, чтобы избежать сбоев.


Чтобы переформатировать произвольный ввод кортежей, вы можете использовать это:

Решение на Python 3.6:

 from itertools import zip_longest
import csv

data  = [('apple', '2'), ('banana', '10'), ('apple', '21'), 
         ('banana', '24'), ('pears','10'),('pears','30'),
        ('banana', '24'), ('banana','3000')]

# convert data into dictionary - use collections.defaultdict if speed is a problem
d = {}
for key,value in data:
    d.setdefault(key,[]).append(value)    

# transpose to output format
outdata = zip_longest(*( [k] i for k,i in d.items() ),"")

with open("fruits.csv", "w", newline ="" ) as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(outdata)
  

Выходной файл:

 apple,banana,pears,
2,10,10,
21,24,30,
,24,,
,3000,,
  

Doku:


Python 2.7 — нет zip_longest в itertools:

 import csv

data  = [('apple', '2'), ('banana', '10'), ('apple', '21'), 
         ('banana', '24'), ('pears','10'),('pears','30'),
        ('banana', '24'), ('banana','3000')]

# convert data into dictionary - use collections.defaultdict if speed is a problem
d = {}
for key,value in data:
    d.setdefault(key,[]).append(value)   

# get longest list value to fill up shorter ones
longest = len(max(d.values(), key=len))

kr = []

# build up column sublists with empty filler lists
for key in d:
    kr.append([key])
    kr[-1].extend(d[key])
    addon = longest - len(d[key])
    if addon:
        kr[-1].extend( [""]* addon)

# transpose columns into rows
outdata = zip(*kr) 

with open("fruits.csv", "w") as csvFile:
    writer = csv.writer(csvFile)
    writer.writerows(outdata)

print(open("fruits.csv").read()) 
  

Комментарии:

1. Хотя я согласен, что SO не предназначен для выполнения чьей-либо домашней работы, имхо опубликованный ответ должен решить проблему. В вашем ответе не показано, как группировать значения.

2. что, если порядок кортежей изменится?

3. @user9538877 Вам нужно создать список кортежей строк (или списков), которые вы вводите в csv.writerows(). Если ваши данные изменятся, вам нужно расположить правильные числа позиционно друг над другом.

4. @Scotty1- в его вопросе не возникает никаких проблем с перестановкой чего-либо, в нем просто указаны входные данные, выходные данные и требуемый результат. Мой ответ предоставляет структуру, необходимую для достижения этого результата.

5. Нет проблем, спасибо