![](/img/trans.png)
[英]How to write nested dictionary in csv with python when the row contents are key values of related key (the header of each column)?
[英]Python: How to write dictionary to csv file when one key has multiple values, each key is a new row, but each value is a new column?
我有一個正在編寫的腳本,它獲取大量信息並將其添加到一些列表中,然后我將這些列表添加到字典中。 這是字典的樣子:
{'0.001': ('16.36', '35.45', '48.15', '99.96'), '0.1': ('11.10', '43.40', '45.49', '99.99'), '0.2': ('12.49', '35.67', '51.85', '100.01'), '0.3': ('16.71', '28.27', '55.04', '100.02'), '0.5': ('23.71', '20.65', '55.63', '99.99'), '0.75': ('32.50', '15.83', '51.68', '100.01'), '1.0': ('39.24', '14.21', '46.57', '100.02'), '2.0': ('55.06', '11.05', '33.91', '100.02'), '3.0': ('59.81', '6.72', '33.44', '99.97')}
對於每個鍵,都有四個與之關聯的值。
我希望每個鍵都是它自己的行,每個值都在同一行的新列中。
到目前為止,這是我的代碼:
periods = []
interface_sum = []
intraslab_sum = []
crustal_sum = []
total_sums = []
out = dict(zip(periods, zip(interface_sum, intraslab_sum, crustal_sum, total_sums)))
with open ('dict.csv','w', newline='') as csv_file:
writer = csv.writer(csv_file)
for key, value in out.items():
writer.writerow([key, value])
這些列表中填充了此處顯示的信息:
periods = ['0.001', '0.1', '0.2', '0.3', '0.5', '0.75', '1.0', '2.0', '3.0']
interface_sum = ['16.36', '11.10', '12.49', '16.71', '23.71', '32.50', '39.24', '55.06', '59.81']
intraslab_sum = ['35.45', '43.40', '35.67', '28.27', '20.65', '15.83', '14.21', '11.05', '6.72']
crustal_sum = ['48.15', '45.49', '51.85', '55.04', '55.63', '51.68', '46.57', '33.91', '33.44']
total_sum = ['99.96', '99.99', '100.01', '100.02', '99.99', '100.01', '100.02', '100.02', '99.97']
句點是我想要的鍵,接下來的 4 個列表是值。 這是 csv output 的圖像,它將鍵放入其自己的列中,並為我想要的每個鍵創建一個新行,但是每個鍵的值都放在同一個 B 列中,我希望每個值在它自己的專欄。 所以第一行 0.001,我想要 B 列中的 16.36,然后列中的 35.45,C,等等。 知道如何完成這項工作嗎?
你快到了。 您可以在創建每個行列表時使用*
解壓value
元組
with open ('dict.csv','w', newline='') as csv_file:
writer = csv.writer(csv_file)
for key, value in out.items():
writer.writerow([key, *value])
這可以縮短一點
with open ('dict.csv','w', newline='') as csv_file:
csv.writer(csv_file).writerows([k, *v] for k,v in out.items())
鑒於:
vals={'0.001': ('16.36', '35.45', '48.15', '99.96'), '0.1': ('11.10', '43.40', '45.49', '99.99'), '0.2': ('12.49', '35.67', '51.85', '100.01'), '0.3': ('16.71', '28.27', '55.04', '100.02'), '0.5': ('23.71', '20.65', '55.63', '99.99'), '0.75': ('32.50', '15.83', '51.68', '100.01'), '1.0': ('39.24', '14.21', '46.57', '100.02'), '2.0': ('55.06', '11.05', '33.91', '100.02'), '3.0': ('59.81', '6.72', '33.44', '99.97')}
首先列出您想要的值:
keys=['periods','interface_sum','intraslab_sum','crustal_sum','total_sums']
然后你可以對那些與重新格式化的列表相關聯的鍵進行字典:
di={k:[v[0]]+list(v[1]) for k,v in zip(keys, vals.items())}
>>> di
{'periods': ['0.001', '16.36', '35.45', '48.15', '99.96'], 'interface_sum': ['0.1', '11.10', '43.40', '45.49', '99.99'], 'intraslab_sum': ['0.2', '12.49', '35.67', '51.85', '100.01'], 'crustal_sum': ['0.3', '16.71', '28.27', '55.04', '100.02'], 'total_sums': ['0.5', '23.71', '20.65', '55.63', '99.99']}
如果您只想將鍵值與關聯的元組連接起來:
new_vals=[[k]+list(v) for k,v in vals.items()]
>>> new_vals
[['0.001', '16.36', '35.45', '48.15', '99.96'], ['0.1', '11.10', '43.40', '45.49', '99.99'], ['0.2', '12.49', '35.67', '51.85', '100.01'], ['0.3', '16.71', '28.27', '55.04', '100.02'], ['0.5', '23.71', '20.65', '55.63', '99.99'], ['0.75', '32.50', '15.83', '51.68', '100.01'], ['1.0', '39.24', '14.21', '46.57', '100.02'], ['2.0', '55.06', '11.05', '33.91', '100.02'], ['3.0', '59.81', '6.72', '33.44', '99.97']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.