[英]dict from a dict of list
我有一個 Python 字典,格式如下:
d1 = {'Name':['ABC'], 'Number':['123'], 'Element 1':['1', '2', '3'],
'Element2':['1','2','3']}
預期 output:
{'Name': 'ABC', 'Number': '123',
'Elements': [{'Element 1': '1', 'Element2': '1'},
{'Element 1': '2', 'Element2': '2'},
{'Element 1': '3', 'Element2': '3'}]
我嘗試了以下方法:
[{k: v[i] for k, v in d1.items() if i < len(v)}
for i in range(max([len(l) for l in d1.values()]))]
但得到這個結果:
[{'Name': 'ABC', 'Number': '123', 'Element 1': '1', 'Element 2': '1'},
{'Element 1': '2', 'Element 2': '2'},
{'Element 1': '3', 'Element 2': '3'}]
我怎么能從這里 go ?
我強烈建議不要嘗試在一行中做所有事情。 如果您有任何分支邏輯或嵌套循環,它並不總是更有效,而且幾乎總是不太可讀。
給定您的字典,我們可以將Name
和Number
鍵pop()
到我們的新字典中。 然后
output = dict()
d1 = {'Name':['ABC'], 'Number':['123'], 'Element 1':['1', '2', '3'], 'Element2':['1','2','3']}
output["Name"] = d1.pop("Name")
output["Number"] = d1.pop("Number")
print(output)
# prints:
# {'Name': ['ABC'], 'Number': ['123']}
print(d1)
# prints:
# {'Element 1': ['1', '2', '3'], 'Element2': ['1', '2', '3']}
然后,我們 zip 字典中所有剩余的值,並將它們添加到一個新列表中:
mylist = []
keys = d1.keys()
for vals in zip(*d1.values()):
temp_obj = dict(zip(keys, vals))
mylist.append(temp_obj)
print(mylist)
# prints:
# [{'Element 1': '1', 'Element2': '1'},
# {'Element 1': '2', 'Element2': '2'},
# {'Element 1': '3', 'Element2': '3'}]
最后,將其分配給output["Elements"]
output["Elements"] = mylist
print(output)
# prints:
# {'Name': ['ABC'], 'Number': ['123'], 'Elements': [{'Element 1': '1', 'Element2': '1'}, {'Element 1': '2', 'Element2': '2'}, {'Element 1': '3', 'Element2': '3'}]}
由於您不想硬編碼前兩個鍵,
for k, v in d1.items():
if "element" not in k.lower():
output[k] = v
或作為字典理解:
output = {k: v for k, v in d1.items() if "element" not in k.lower()}
使用元組列表來創建字典的元素列表。 使用 Convert 從元組構建您的字典項。
#https://www.geeksforgeeks.org/python-convert-list-tuples-dictionary/
d1 = {'Name':['ABC'], 'Number':['123'], 'Element 1':['1', '2', '3'],
'Element2':['1','2','3']}
def Convert(tup, di):
for a, b in tup:
di[a]=b
return di
dict={}
listElements=[]
for key,value in d1.items():
if isinstance(value,list) and len(value)>1:
for item in value:
listElements.append((key,item))
elif isinstance(value,list) and len(value)==1:
dict[key]=value[0]
else:
dict[key]=value
dict['Elements']=[Convert([(x,y)],{}) for x,y in listElements]
print(dict)
output:
{'Name': 'ABC', 'Number': '123', 'Elements': [{'Element 1': '1'}, {'Element 1': '2'}, {'Element 1': '3'}, {'Element2': '1'}, {'Element2': '2'}, {'Element2': '3'}]}
我將逐步解釋:
我們構建new_d1
變量,即您期望的字典 output 並且它被初始化為{'Name': 'ABC', 'Number': '123'}
。 為了實現上述目的,我們使用理解符號,同時考慮到鍵!=
'Element'
new_d1 = {key: d1.get(key)[0] for key in filter(lambda x: 'Element' not in x, d1)}
我們構建elements
變量,這是一個包含字典的列表,對我們來說很重要,我的意思是,我們必須操縱字典才能達到預期的結果。 然后elements
是[{'Element 1': ['1', '2', '3']}, {'Element2': ['1', '2', '3']}]
。
elements = [{key: d1.get(key)} for key in filter(lambda x: 'Element' in x, d1)]
我們將使用itertools.product
做一個笛卡爾積,考慮到elements
中存在的每個鍵和值的每個項目。
product = [list(it.product(d.keys(), *d.values())) for d in elements]
使用zip
,我們排列數據並將它們隱藏在字典中。 最后我們在new_df1
中創建"Elements"
鍵
elements_list = [dict(t) for index, t in enumerate(list(zip(*product)))] new_d1["Elements"] = elements_list print(new_d1)
完整代碼:
import itertools as it
new_d1 = {key: d1.get(key)[0] for key in filter(lambda x: 'Element' not in x, d1)}
elements = [{key: d1.get(key)} for key in filter(lambda x: 'Element' in x, d1)]
product = [list(it.product(d.keys(), *d.values())) for d in elements]
elements_list = [dict(t) for index, t in enumerate(list(zip(*product)))]
new_d1["Elements"] = elements_list
Output:
{'Elements': [{'Element 1': '1', 'Element2': '1'},
{'Element 1': '2', 'Element2': '2'},
{'Element 1': '3', 'Element2': '3'}],
'Name': 'ABC',
'Number': '123'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.