簡體   English   中英

從一個字典中提取多個鍵:值對到一個新的字典

[英]Extract multiple key:value pairs from one dict to a new dict

我有一個包含一些數據的 dict 列表,我想將某些鍵:值對提取到一個新的 dict 列表中。 我知道我可以這樣做的一種方法是使用del i['unwantedKey'] ,但是,我寧願不刪除任何數據,而是創建一個包含所需數據的新字典。

列順序可能會改變,所以我需要一些東西從較大的字典中提取兩個鍵:值對到一個新的字典中。

當前數據格式

[{'Speciality': 'Math', 'Name': 'Matt', 'Location': 'Miami'},
 {'Speciality': 'Science', 'Name': 'Ben', 'Location': 'Las Vegas'}, 
 {'Speciality': 'Language Arts', 'Name': 'Sarah', 'Location': 'Washington DC'},
 {'Speciality': 'Spanish', 'Name': 'Tom', 'Location': 'Denver'},
 {'Speciality': 'Chemistry', 'Name': 'Jim', 'Location': 'Dallas'}]

從字典中刪除鍵:值的代碼

import csv

data= []
for line in csv.DictReader(open('data.csv')):
    data.append(line)

for i in data:
    del i['Speciality']

print data

不使用del i['Speciality']所需的數據格式

[{'Name': 'Matt', 'Location': 'Miami'}, 
 {'Name': 'Ben', 'Location': 'Las Vegas'}, 
 {'Name': 'Sarah', 'Location': 'Washington DC'}, 
 {'Name': 'Tom', 'Location': 'Denver'}, 
 {'Name': 'Jim', 'Location': 'Dallas'}]

如果要提供肯定的鍵列表以復制到新詞典中:

import csv

with open('data.csv', 'rb') as csv_file:
    data = list(csv.DictReader(csv_file))

keys = ['Name', 'Location']
new_data = [dict((k, d[k]) for k in keys) for d in data]

print new_data

假設我們有,

l1 = [{'Location': 'Miami', 'Name': 'Matt', 'Speciality': 'Math'},
      {'Location': 'Las Vegas', 'Name': 'Ben', 'Speciality': 'Science'},
      {'Location': 'Washington DC', 'Name': 'Sarah', 'Speciality': 'Language Arts'},
      {'Location': 'Denver', 'Name': 'Tom', 'Speciality': 'Spanish'},
      {'Location': 'Dallas', 'Name': 'Jim', 'Speciality': 'Chemistry'}]

創建不包含鍵“ Speciality”的新詞典列表,

l2 = []
for oldd in l1:
    newd = {}
    for k,v in oldd.items():
        if k != 'Speciality':
            newd[k] = v
    l2.append(newd)

現在l2將是您想要的輸出。 通常,您可以像這樣排除任意鍵列表

exclude_keys = ['Speciality', 'Name']
l2 = []
    for oldd in l1:
        newd = {}
        for k,v in oldd.items():
            if k not in exclude_keys:
                newd[k] = v
        l2.append(newd)

使用include_keys變量也可以做到這一點

include_keys = ['Name', 'Location']
l2 = []
    for oldd in l1:
        newd = {}
        for k,v in oldd.items():
            if k in include_keys:
                newd[k] = v
        l2.append(newd)

您可以使用一行代碼(Python 2.6+)創建新的字典列表,將其限制為所需的鍵:

NLoD=[{k:d[k] for k in ('Name', 'Location')} for d in LoD]

試試吧:

>>> LoD=[{'Speciality': 'Math', 'Name': 'Matt', 'Location': 'Miami'},
 {'Speciality': 'Science', 'Name': 'Ben', 'Location': 'Las Vegas'}, 
 {'Speciality': 'Language Arts', 'Name': 'Sarah', 'Location': 'Washington DC'},
 {'Speciality': 'Spanish', 'Name': 'Tom', 'Location': 'Denver'},
 {'Speciality': 'Chemistry', 'Name': 'Jim', 'Location': 'Dallas'}]
>>> [{k:d[k] for k in ('Name', 'Location')} for d in LoD]
[{'Name': 'Matt', 'Location': 'Miami'}, {'Name': 'Ben', 'Location': 'Las Vegas'}, {'Name': 'Sarah', 'Location': 'Washington DC'}, {'Name': 'Tom', 'Location': 'Denver'}, {'Name': 'Jim', 'Location': 'Dallas'}]

由於您使用的是csv,因此可以將首先讀取的列限制為所需的列,這樣就無需刪除不需要的數據:

dc=('Name', 'Location')        
with open(fn) as f:
    reader=csv.DictReader(f)
    LoD=[{k:row[k] for k in dc} for row in reader]
keys_lst = [Name', 'Location]

new_data={key:val for key,val in event.items() if key in keys_lst}
print(new_data)

暫無
暫無

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

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