簡體   English   中英

將一個字典/列表 python 結構更改為另一個

[英]Change one dict/list python structure to another

我有以下數據

data={
       None: [
               {'ne': '1', 'na': '1'}, 
               {'ne': '2', 'na': '2'}, 
               {'ne': '3', 'na': '3'}, 
               {'ne': '4', 'na': '4'}
             ], 
      'AO': [
               {'ne': '2', 'na': '2'}, 
               {'ne': '6', 'na': '6'}
            ], 
      'NZ': [
               {'ne': '1', 'na': '1'}
            ]
      }

我想從中得到一個這樣的列表:

[
  {'ne': '1', 'na': '1', 'country': [None, 'NZ']},
  {'ne': '2', 'na': '2', 'country': [None, 'AO']},
  {'ne': '3', 'na': '3', 'country': [None]},
  {'ne': '4', 'na': '4', 'country': [None]},
  {'ne': '6', 'na': '6', 'country': ['AO']}
]

我的代碼運行良好,但遠非“pythonic”,因為我是 python 的新手:

data = {None: [{'ne': '1', 'na': '1'}, {'ne': '2', 'na': '2'}, {'ne': '3', 'na': '3'}, {'ne': '4', 'na': '4'}], 'AO': [{'ne': '2', 'na': '2'}, {'ne': '6', 'na': '6'}], 'NZ': [{'ne': '1', 'na': '1'}]}
data_list = []
for k,d in data.items():
    for dd in d:
        dd['country'] = k
        data_list.append(dd)
help_dict = {}
for item in data_list:
    help_dict[item['ne']] = False
final_list = []
for idx, val in enumerate(data_list):
    if not help_dict[val['ne']]:
        val['country'] = [val['country']]
        for idx2, val2 in enumerate(data_list):
            if idx2 != idx and val['ne'] == val2['ne']:
                val['country'].append(val2['country'])
        help_dict[val['ne']] = True
        final_list.append(val)
print(final_list)

有人可以用更好的方法幫助我嗎?

這是解決您的問題的一種非常幼稚的方法,因為它要求內部字典以相同的順序排序,以“匹配”較早找到的字典。

對於國內更復雜的字典,這可能不會給出正確的結果:

data={
       None: [
               {'ne': '1', 'na': '1'},
               {'ne': '2', 'na': '2'},
               {'ne': '3', 'na': '3'},
               {'ne': '4', 'na': '4'}
             ],
      'AO': [
               {'ne': '2', 'na': '2'},
               {'ne': '6', 'na': '6'}
            ],
      'NZ': [
               {'ne': '1', 'na': '1'}
            ]
      }

d = {}
for country in data:
    for dictionary in data[country]:
        # Create a key that is a string of the dictionary, and value is dictionary plus country
        x = d.setdefault(str(dictionary), dictionary | {"country": []})
        # If you're using Python < 3.9, use this instead:
        # x = d.setdefault(str(dictionary), {**dictionary, "country": []})
        x["country"].append(country)

# pprint only used to represent data better
import pprint
pprint.pp(list(d.values()))

Output:

[{'ne': '1', 'na': '1', 'country': [None, 'NZ']},
 {'ne': '2', 'na': '2', 'country': [None, 'AO']},
 {'ne': '3', 'na': '3', 'country': [None]},
 {'ne': '4', 'na': '4', 'country': [None]},
 {'ne': '6', 'na': '6', 'country': ['AO']}]

首先,我假設nena總是相同的。

一個最佳的中間數據結構是一個以ne / na為鍵和國家列表作為值的字典:

{'1': [None, 'NZ'],
 '2': [None, 'AO'],
 '3': [None],
 '4': [None],
 '6': ['AO']}

一旦你有了這個目標,就可以非常簡單地用 Python 來實現它:

inter = {}
for k, dicts in data.items():
    for d in dicts:
        inter.setdefault(d['ne'], []).append(k)
  • dict.setdefault()用於獲取該值是否存在,如果不存在則設置為默認值,此處為空列表。 它的功能與此相同:
     ne = d['ne'] if ne not in inter: inter[ne] = [] inter[ne].append(k)
    您還可以使用collections.defaultdict(list)更輕松地執行相同的操作。

一旦你有了那個字典,你只需要把它解壓到一個字典列表中:

result = [{'ne': ne, 'na': ne, 'country': c} for ne, c in inter.items()]

變成:

[{'ne': '1', 'na': '1', 'country': [None, 'NZ']},
 {'ne': '2', 'na': '2', 'country': [None, 'AO']},
 {'ne': '3', 'na': '3', 'country': [None]},
 {'ne': '4', 'na': '4', 'country': [None]},
 {'ne': '6', 'na': '6', 'country': ['AO']}]
new = [x for key,value in data.items() for x in value]

# remove duplicate dictionaries
new = [dict(t) for t in {tuple(d.items()) for d in new}]

for d in new:
    d['country'] = [key for key,data in data.items() if d in data]

print(new)

>>> [{'ne': '2', 'na': '2', 'country': [None, 'AO']}, 
     {'ne': '4', 'na': '4', 'country': [None]}, 
     {'ne': '1', 'na': '1', 'country': [None, 'NZ']}, 
     {'ne': '6', 'na': '6', 'country': ['AO']}, 
     {'ne': '3', 'na': '3', 'country': [None]}]

如果您想保留訂單

new = [x for n,(key,value) in enumerate(data.items()) for x in value]

seen = set()
new_l = []
for d in new:
    t = tuple(d.items())
    if t not in seen:
        seen.add(t)
        new_l.append(d)

for d in new_l:
    d['country'] = [key for key,data in data.items() if d in data]

print(new_l)

>>> [{'ne': '1', 'na': '1', 'country': [None, 'NZ']}, 
     {'ne': '2', 'na': '2', 'country': [None, 'AO']}, 
     {'ne': '3', 'na': '3', 'country': [None]}, 
     {'ne': '4', 'na': '4', 'country': [None]}, 
     {'ne': '6', 'na': '6', 'country': ['AO']}]

暫無
暫無

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

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