我有一个类似于下面的字典列表。实际数据包含任意多个键,这只是数据的一个示例:
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]
但是,该代码只返回以下输出:
['jamie', 'tara', 'matt']
谁能帮助我如何返回所有值作为列表的列表?此外,考虑到在我的实际列表中将有许多键,是否有可能以一种不需要指定键名的方式编写代码?
通过使用两次列表推导式,您可以得到您想要的:
[[i['name'] for i in l], [i['age'] for i in l]]
<标题>更新我的假设:
- 每个字典有相同的键/值
- 你不想使用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)]
这应该适用于所有字典,只要它们具有相同的键。
标题>您可以使用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'}
,第二个也可以工作。
上面的l的实现不起作用,但是如果您像这样使用'age'代替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现在是[["杰米"、"塔拉","马特"],[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]]
这将遍历所有字典并编译每个键的值。它不依赖于字典是否相同,也不依赖于排序。
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()]