如何从字典中创建具有相同键的值列表



我有一个类似于下面的字典列表。实际数据包含任意多个键,这只是数据的一个示例:

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

我的方法是

  1. 从其中一个字典中获取键,第一个将执行
>>> keys = l[0].keys()   # key = ['name', 'age'] conceptually
  1. 将字典列表转换为元组列表,其中每个元组以正确的顺序包含值:
>>> [[i[k] for k in keys] for i in l]
[['jamie', 26], ['tara', 43], ['matt', 34]]
  1. 给定这个元组列表,我可以使用listzip的组合来转置它们:
>>> 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()]

相关内容

  • 没有找到相关文章

最新更新