簡體   English   中英

來自列表字典的字典

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

我強烈建議不要嘗試在一行中做所有事情。 如果您有任何分支邏輯或嵌套循環,它並不總是更有效,而且幾乎總是不太可讀。

給定您的字典,我們可以將NameNumberpop()到我們的新字典中。 然后

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'}]}  

我將逐步解釋:

  1. 我們構建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)}
  2. 我們構建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)]
  3. 我們將使用itertools.product做一個笛卡爾積,考慮到elements中存在的每個鍵和值的每個項目

     product = [list(it.product(d.keys(), *d.values())) for d in elements]
  4. 使用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.

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