如何使用字典中的相同键创建值列表

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

我的做法是

  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)]

这应该适用于所有字典,前提是它们具有相同的键。

上述 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()]