Разбор словаря в электронную таблицу на Python
У меня есть некоторые данные в этом похожем формате:
James has 6 jeans, 10 shirts, 5 shoes, 6 ties
Nick has 8 jeans, 4 shirts, 3 shoes, 4 ties
Adam has 2 jeans, 3 shirts, 5 shoes, 1 tie
John has 6 jeans, 5 shirts, 10 shoes, 3 ties
С помощью collections.defaultdict(list)
Я создал словарь в следующем формате:
{James: [[Jeans, 6],
[Shirts, 10],
[Shoes, 5],
[Ties, 6]],
Nick: [[Jeans, 8],
[Shirts, 4],
[Shoes, 3],
[Ties, 4]],
Adam: [[Jeans, 2],
[Shirts, 3],
[Shoes, 5],
[Ties, 1]],
John: [[Jeans, 6],
[Shirts, 5],
[Shoes, 10],
[Ties, 3]]}
Я пытаюсь получить этот вывод в электронную таблицу cvs:
Accesories James Nick Adam John
Jeans 6 8 2 6
Shirts 10 4 3 5
Shoes 5 3 5 10
Ties 6 4 1 3
После некоторого кодирования до создания словаря, вот код, который я до сих пор пытался создать электронную таблицу, идентичную формату, описанному выше, используя созданный словарь. cvs
,itertools
модули уже импортированы.
with open(outputcsv, 'w') as w:
writer = csv.writer(w, delimiter=',', lineterminator='\n')
writer.writerow(dict.keys())
zipped = itertools.izip_longest(*dict.values())
writer.writerows(list(zipped))
Это приближает меня к намеченному решению, но не совсем.
1 ответ
Это было бы проще, как диктат диктатов, а не диктат списков.
Предполагать:
w={'James': {'Jeans': 6,
'Shirts': 10,
'Shoes': 5,
'Ties': 6,},
'Nick': {'Jeans': 8,
'Shirts': 4,
'Shoes': 3,
'Ties': 4},
'Adam': {'Jeans': 2,
'Shirts': 3,
'Shoes': 5,
'Ties': 1},
'John': {'Jeans': 6,
'Shirts': 5,
'Shoes': 10,
'Ties': 3,
'Belts': 1}}
уведомление John
имеет пояс, а другие нет, и это диктат, а не списки списков двух элементов.
Во-первых, давайте получим список (хорошо, набор...) всех аксессуаров, которые есть у каждого:
accessories=set()
for nam, di in w.items():
for k in di:
accessories.add(k)
>>> accessories
set(['Ties', 'Belts', 'Jeans', 'Shirts', 'Shoes'])
Теперь легко создать CSV из этих элементов в вашем формате:
import csv
with open('/tmp/so.csv', 'w') as f:
writer=csv.writer(f)
writer.writerow(['accessories']+w.keys())
for item in accessories:
li=[item]
for nam in w:
li.append(w[nam].get(item, 0))
writer.writerow(li)
Теперь посмотрите на файл:
accessories,James,John,Adam,Nick
Ties,6,3,1,4
Belts,0,1,0,0
Jeans,6,6,2,8
Shirts,10,5,3,4
Shoes,5,10,5,3
Если вы застряли с указанием списка списков каждые два элемента (как у вас в вашем примере), вы можете преобразовать их:
>>> w={'James': [['Jeans', 6],
... ['Shirts', 10],
... ['Shoes', 5],
... ['Ties', 6]],
... 'Nick': [['Jeans', 8],
... ['Shirts', 4],
... ['Shoes', 3],
... ['Ties', 4]],
... 'Adam': [['Jeans', 2],
... ['Shirts', 3],
... ['Shoes', 5],
... ['Ties', 1]],
... 'John': [['Jeans', 6],
... ['Shirts', 5],
... ['Shoes', 10],
... ['Ties', 3],
... ['Belts', 1]]}
>>> {k:dict(LoL) for k, LoL in w.items()}
{'James': {'Ties': 6, 'Jeans': 6, 'Shirts': 10, 'Shoes': 5}, 'John': {'Ties': 3, 'Belts': 1, 'Jeans': 6, 'Shirts': 5, 'Shoes': 10}, 'Adam': {'Ties': 1, 'Jeans': 2, 'Shirts': 3, 'Shoes': 5}, 'Nick': {'Ties': 4, 'Jeans': 8, 'Shirts': 4, 'Shoes': 3}}