簡體   English   中英

Python:當一個鍵有多個值時,如何將字典寫入csv文件,每個鍵是一個新行,但每個值是一個新列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM