从一个字典中提取多个键:值对到新的字典

时间:2014-07-10 23:48:22

标签: python dictionary

我有一个dict列表,有些数据,我想将某些key:value对提取到一个新的dicts列表中。我知道我可以这样做的一种方法是使用del i['unwantedKey'],但是,我宁愿不删除任何数据,而是创建一个包含所需数据的新dict。

列顺序可能会改变,所以我需要一些东西来提取两个键:从较大的dict到新的dict的值对。

当前数据格式

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

删除密钥的代码:来自dict的值

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

3 个答案:

答案 0 :(得分:1)

如果您想提供一个肯定的密钥列表,请将其复制到新词典中:

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

答案 1 :(得分:0)

假设我们有,

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

创建一个不包含密钥的新词典列表' Specialty'我们可以做到,

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)

答案 2 :(得分:0)

您可以使用一行代码(Python 2.6 +)创建一个新的限制为所需键的dicts列表:

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]