簡體   English   中英

編寫字典列表,每個鍵有多個值作為新行

[英]Writing a list of dictionaries, with multiple values per key as new rows

作為開頭,將會有很多重復的問題,但是這些問題的解決方案都沒有真正幫助過我。 我有使用csv包編寫字典列表的常用代碼:

    import csv
    to_csv = list_dic
    keys = to_csv[0].keys()
    with open('output.csv', 'w') as output_file:
        dict_writer = csv.DictWriter(output_file, keys)
        dict_writer.writeheader()
        dict_writer.writerows(to_csv)

此代碼在帶有單個鍵值的字典列表上使用時效果很好(很好,除了輸出csv每隔一行都有空白行的事實),但是現在我有了一個字典列表,每個鍵都有多個值,很像下面的例子:

    list_dic = [{'a':[x,y],'b':[1,2],'c':[1,2]},
                {'a':[x,y],'b':[1,2],'c':[1,2]},
                {'a':[x,y],'b':[1,2],'c':[1,2]},
                {'a':[x,y],'b':[1,2],'c':[1,2]}]

基本上我的csv輸出當前看起來像這樣:

     'a'     'b'     'c'
    [x,y]   [1,2]   [1,2]
    [x,y]   [1,2]   [1,2]
    [x,y]   [1,2]   [1,2]
    [x,y]   [1,2]   [1,2]

我正在努力到達這里:

      'a'    'b'    'c'
       x      1      1
       y      2      2
       x      1      1
       y      2      2
       x      1      1
       y      2      2
       x      1      1
       y      2      2          

我已經提出了非常相似的問題,但是似乎無法將任何解決方案應用於我的特定情況。 我嘗試使用某種for語句編寫多行,但是失敗了。

感謝您的幫助,如果您知道與這種情況重復的任何問題,請向我指出正確的方向。

編輯:示例每個鍵有2個值,但實際上值的數量是未知的,僅> 1

如果您對數據進行足夠的壓縮和解壓縮,則將獲得所需的格式:

list_dic = [{'a':['x','y'],'b':[1,2],'c':[1,2]},
            {'a':['x','y'],'b':[1,2],'c':[1,2]},
            {'a':['x','y'],'b':[1,2],'c':[1,2]},
            {'a':['x','y'],'b':[1,2],'c':[1,2]}]
import csv
to_csv = list_dic
keys = to_csv[0].keys()
with open('output.csv', 'w') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    for dic in list_dic:
        keys, values = zip(*dic.items())
        for values in zip(*values):
            dict_writer.writerow(dict(zip(keys, values)))

拆分字典,然后通過csv運行它們:

def split_dict(dct):
    result = []
    result.append({k: v[0] for k, v in dct.items()})
    result.append({k: v[1] for k, v in dct.items()})
    return result

def list_dict_split(lst):
    result = []
    for dct in lst:
        result.extend(split_dict(dct))
    return result

現在只要將list_dict_split(list_dic)放到您擁有list_dic的任何地方:

中間列表是:

[{'a': 'x', 'c': 1, 'b': 1}, 
 {'a': 'y', 'c': 2, 'b': 2}, 
 {'a': 'x', 'c': 1, 'b': 1}, 
 {'a': 'y', 'c': 2, 'b': 2}, 
 {'a': 'x', 'c': 1, 'b': 1}, 
 {'a': 'y', 'c': 2, 'b': 2}, 
 {'a': 'x', 'c': 1, 'b': 1}, 
 {'a': 'y', 'c': 2, 'b': 2}]

這是一種替代方法,對於該替代方法,只需一個zip即可將columns轉置為rows

x = 'x'
y = 'y'

list_dic = [{'a': [x, y], 'b':[1, 2], 'c':[1, 2]},
            {'a': [x, y], 'b':[3, 4], 'c':[1, 2]},
            {'a': [x, y], 'b':[1, 2], 'c':[1, 2]},
            {'a': [x, y], 'b':[3, 4], 'c':[1, 2]}]

keys = ['a', 'b', 'c']
sep = "\t"

print(sep.join(keys))
for dic in list_dic:
    columns = [dic[key] for key in keys]
    for row in zip(*columns):
        print(sep.join(str(cell) for cell in row))

輸出:

a   b   c
x   1   1
y   2   2
x   3   1
y   4   2
x   1   1
y   2   2
x   3   1
y   4   2

您可以將當前詞典列表轉換為分解詞典列表,然后將其寫入csv:

>>> import itertools as it
>>> [dict(n) for d in list_dic for n in zip(*(zip(it.repeat(k), v) for k, v in d.items()))]
[{'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 2, 'c': 2},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 2, 'c': 2},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 2, 'c': 2},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 2, 'c': 2}]

這適用於任意數量的值:

>>> list_dic = [{'a':['x','y','z'],'b':[1,2,3],'c':[1,2,3]},
...             {'a':['x','y','a'],'b':[1,3,2],'c':[1,2,1]},
...             {'a':['x','y','b'],'b':[1,4,3],'c':[1,2,4]},
...             {'a':['x','y','a'],'b':[1,5,2],'c':[1,2,9]}]
>>> [dict(n) for d in list_dic for n in zip(*(zip(it.repeat(k), v) for k, v in d.items()))]
[{'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 2, 'c': 2},
 {'a': 'z', 'b': 3, 'c': 3},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 3, 'c': 2},
 {'a': 'a', 'b': 2, 'c': 1},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 4, 'c': 2},
 {'a': 'b', 'b': 3, 'c': 4},
 {'a': 'x', 'b': 1, 'c': 1},
 {'a': 'y', 'b': 5, 'c': 2},
 {'a': 'a', 'b': 2, 'c': 9}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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