如何使用字典中的相同键创建值列表
How to create a list of values with the same key from a dictionary
我有一个类似于以下的词典列表。实际数据包含任意多个键,这只是数据示例:
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
我需要做的是访问 name 和 age 键的值,并将它们作为如下列表:
[['jamie', 'tara', 'matt'], [26, 43, 34]]
我知道如果我需要创建单个键的列表,我可以使用以下代码打印它们的值:
[d["name"] for d in l]
但是,该代码仅 return 输出以下内容:
['jamie', 'tara', 'matt']
谁能帮我如何 return 所有值作为列表的列表?另外,考虑到我的真实列表中会有很多键,是否可以以不需要指定键名的方式编写代码?
通过两次使用列表理解,你可以得到你想要的:
[[i['name'] for i in l], [i['age'] for i in l]]
更新
我的假设:
- 每个字典都有相同的keys/values
- 您不想使用 pandas
我的做法是
- 从其中一本词典中获取关键字,第一个就可以了
>>> keys = l[0].keys() # key = ['name', 'age'] conceptually
- 将字典列表转换为元组列表,其中每个元组都以正确的顺序包含值:
>>> [[i[k] for k in keys] for i in l]
[['jamie', 26], ['tara', 43], ['matt', 34]]
- 鉴于这个元组列表,我可以使用
list
和 zip
的组合来转置它们:
>>> list(zip([[i[k] for k in keys] for i in l]))
[('jamie', 'tara', 'matt'), (26, 43, 34)]
这应该适用于所有字典,前提是它们具有相同的键。
上述 l 的实现将不起作用,但如果您使用 'age' 而不是像这样的年龄
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
您可以创建两个列表并像这样遍历每个字典。
names = []
ages = []
for d in l:
names.append(d['name'])
ages.append(d['age'])
names_ages = [names,ages]
names_ages 现在是 [['jamie', 'tara', 'matt'], [26, 43, 34]]
首先,我必须修复您的 dict
输入,因为 age
键不是字符串。下面迭代一次字典列表。
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
names = []
ages = []
for row in l:
names.append(row["name"])
ages.append(row["age"])
output = [names, ages]
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
我认为没有列表理解它更具可读性。
看到你要求不知道密钥…
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
from collections import defaultdict
value_lists = defaultdict(list)
for row in l:
for k, v in row.items():
value_lists[k].append(v)
# print(value_lists)
# if it must be list of lists
output = list(value_lists.values())
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
您可以使用 zip
:
l = [{'name': 'jamie', 'age': 26, 'hobby': 'fishing'},
{'name': 'tara', 'age': 43, 'hobby': 'soccer'},
{'name': 'matt', 'age': 34, 'hobby': 'knitting'}]
output = list(zip(*(dct.values() for dct in l))) # first method
print(output)
# [('jamie', 'tara', 'matt'), (26, 43, 34), ('fishing', 'soccer', 'knitting')]
keys = l[0].keys() # second method
output = list(zip(*([dct[k] for k in keys] for dct in l)))
print(output)
在这里,如果键的顺序相同,则第一种方法有效(因此适用于 python 3.7+)。即使第二个字典是 {'age': 43, 'name': 'tara', 'hobby': 'soccer'}
.
,第二个字典仍然有效
这将遍历您所有的字典并编译每个键的值。它不依赖于相同的词典,也不依赖于排序。
from pprint import pprint
l = [{'name': 'jamie', 'age': 26, 'color': 'gold'},
{'name': 'tara', 'age': 43, 'hobby': 'archery'},
{'name': 'matt', 'age': 34, 'epic': 'louhi'}
]
def compile(ls):
dx = dict()
for d in ls:
for k, v in d.items():
current = dx.get(k, []) # Leverage get() default value option
current.append(v)
dx[k] = current
return dx
result = compile(l)
pprint(result)
这会产生输出:
{'age': [26, 43, 34],
'color': ['gold'],
'epic': ['louhi'],
'hobby': ['archery'],
'name': ['jamie', 'tara', 'matt']}
如果需要,删除密钥很简单:
only_values = [v for _, v in result.items()]
我有一个类似于以下的词典列表。实际数据包含任意多个键,这只是数据示例:
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
我需要做的是访问 name 和 age 键的值,并将它们作为如下列表:
[['jamie', 'tara', 'matt'], [26, 43, 34]]
我知道如果我需要创建单个键的列表,我可以使用以下代码打印它们的值:
[d["name"] for d in l]
但是,该代码仅 return 输出以下内容:
['jamie', 'tara', 'matt']
谁能帮我如何 return 所有值作为列表的列表?另外,考虑到我的真实列表中会有很多键,是否可以以不需要指定键名的方式编写代码?
通过两次使用列表理解,你可以得到你想要的:
[[i['name'] for i in l], [i['age'] for i in l]]
更新
我的假设:
- 每个字典都有相同的keys/values
- 您不想使用 pandas
我的做法是
- 从其中一本词典中获取关键字,第一个就可以了
>>> keys = l[0].keys() # key = ['name', 'age'] conceptually
- 将字典列表转换为元组列表,其中每个元组都以正确的顺序包含值:
>>> [[i[k] for k in keys] for i in l]
[['jamie', 26], ['tara', 43], ['matt', 34]]
- 鉴于这个元组列表,我可以使用
list
和zip
的组合来转置它们:
>>> list(zip([[i[k] for k in keys] for i in l]))
[('jamie', 'tara', 'matt'), (26, 43, 34)]
这应该适用于所有字典,前提是它们具有相同的键。
上述 l 的实现将不起作用,但如果您使用 'age' 而不是像这样的年龄
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
您可以创建两个列表并像这样遍历每个字典。
names = []
ages = []
for d in l:
names.append(d['name'])
ages.append(d['age'])
names_ages = [names,ages]
names_ages 现在是 [['jamie', 'tara', 'matt'], [26, 43, 34]]
首先,我必须修复您的 dict
输入,因为 age
键不是字符串。下面迭代一次字典列表。
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
names = []
ages = []
for row in l:
names.append(row["name"])
ages.append(row["age"])
output = [names, ages]
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
我认为没有列表理解它更具可读性。
看到你要求不知道密钥…
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
from collections import defaultdict
value_lists = defaultdict(list)
for row in l:
for k, v in row.items():
value_lists[k].append(v)
# print(value_lists)
# if it must be list of lists
output = list(value_lists.values())
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
您可以使用 zip
:
l = [{'name': 'jamie', 'age': 26, 'hobby': 'fishing'},
{'name': 'tara', 'age': 43, 'hobby': 'soccer'},
{'name': 'matt', 'age': 34, 'hobby': 'knitting'}]
output = list(zip(*(dct.values() for dct in l))) # first method
print(output)
# [('jamie', 'tara', 'matt'), (26, 43, 34), ('fishing', 'soccer', 'knitting')]
keys = l[0].keys() # second method
output = list(zip(*([dct[k] for k in keys] for dct in l)))
print(output)
在这里,如果键的顺序相同,则第一种方法有效(因此适用于 python 3.7+)。即使第二个字典是 {'age': 43, 'name': 'tara', 'hobby': 'soccer'}
.
这将遍历您所有的字典并编译每个键的值。它不依赖于相同的词典,也不依赖于排序。
from pprint import pprint
l = [{'name': 'jamie', 'age': 26, 'color': 'gold'},
{'name': 'tara', 'age': 43, 'hobby': 'archery'},
{'name': 'matt', 'age': 34, 'epic': 'louhi'}
]
def compile(ls):
dx = dict()
for d in ls:
for k, v in d.items():
current = dx.get(k, []) # Leverage get() default value option
current.append(v)
dx[k] = current
return dx
result = compile(l)
pprint(result)
这会产生输出:
{'age': [26, 43, 34],
'color': ['gold'],
'epic': ['louhi'],
'hobby': ['archery'],
'name': ['jamie', 'tara', 'matt']}
如果需要,删除密钥很简单:
only_values = [v for _, v in result.items()]