J'essaie d'écrire un dictionnaire imbriqué en python. J'ai un dictionnaire comme ci-dessous:

{'09-04-2018' : {1: 11, 2: 5, 3: 1, 4: 1, 5: 0} , '10-04-2018' : {1: 5, 2: 1, 3: 1, 4: 1, 5: 0}}

Et je voulais l'écrire quelque chose comme:

count,09-04-2018,10-04-2018
1,11,5
2,5,1
3,1,1
4,1,1
5,0,0
0
Vikash Singh 14 avril 2018 à 14:08

3 réponses

Meilleure réponse

Ce qui suit produit la sortie demandée:

data = {'09-04-2018' : {1: 11, 2: 5, 3: 1, 4: 1, 5: 0} , '10-04-2018' : {1: 5, 2: 1, 3: 1, 4: 1, 5: 0}}

rows = []
keys = sorted(data)
header = ['count'] + keys
counts = sorted(set(k for v in data.values() for k in v))
for count in counts:
    l = [count]
    for key in keys:    
        l.append(data[key].get(count))
    rows.append(l)

print header
print rows

import csv
with open('output.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(header)
    writer.writerows(rows)

Cela crée les lignes avant de les écrire, il est possible de les écrire directement plutôt que de les ajouter à la liste et d'écrire le contenu de la liste.

Produit cette sortie:

count,09-04-2018,10-04-2018
1,11,5
2,5,1
3,1,1
4,1,1
5,0,0
2
Dan D. 14 avril 2018 à 11:25

Vous pouvez raccourcir votre code en utilisant zip:

import csv
d = {'09-04-2018' : {1: 11, 2: 5, 3: 1, 4: 1, 5: 0} , '10-04-2018' : {1: 5, 2: 1, 3: 1, 4: 1, 5: 0}}
with open('filename.csv', 'w') as f:
  write = csv.writer(f)
  full_rows = [i for h in [zip(*b.items()) for _, b in sorted(d.items(), key=lambda x:map(int, x[0].split('-')))] for i in h]
  write.writerows([['counts']+[a for a, _ in sorted(d.items(), key=lambda x:map(int, x[0].split('-')))]]+list(zip(*[full_rows[0]]+full_rows[1::2])))

Production:

counts,09-04-2018,10-04-2018
1,11,5
2,5,1
3,1,1
4,1,1
5,0,0
0
Ajax1234 14 avril 2018 à 15:22

Si vous êtes prêt à utiliser une bibliothèque tierce, vous pouvez utiliser pandas:

import pandas as pd

d = {'09-04-2018' : {1: 11, 2: 5, 3: 1, 4: 1, 5: 0},
     '10-04-2018' : {1: 5, 2: 1, 3: 1, 4: 1, 5: 0}}

# create dataframe from dictionary
df = pd.DataFrame.from_dict(d).reset_index().rename(columns={'index': 'count'})

# write dataframe to csv file
df.to_csv('file.csv', index=False)

print(df)

#    count  09-04-2018  10-04-2018
# 0      1          11           5
# 1      2           5           1
# 2      3           1           1
# 3      4           1           1
# 4      5           0           0
1
jpp 14 avril 2018 à 11:38