提取多个键:值对从一个dict到一个新的di

2024-09-29 06:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dict列表什么的一些数据,我想提取某些键:值对在一个新的字典列表中。我知道一种方法是使用del i['unwantedKey'],但是,我不想删除任何数据,而是用所需的数据创建一个新的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

^{pr2}$

不使用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'}]

Tags: 数据name列表字典locationmattdictlas
3条回答

您可以使用一行代码(Python 2.6+)创建一个新的dict列表,该列表仅限于所需的键:

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

试试看:

^{2}$

因为您使用的是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]

假设我们有

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”,我们可以这样做

^{2}$

现在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)

如果要提供要复制到新词典中的键的肯定列表:

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

相关问题 更多 >