如何将 python 列表中的数据聚合到字典中?
How to aggregate data from a python list to a dictionary?
我有一个列表:
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
聚合字典(或任何其他数据结构)中的数据以获得如下结果的 pythonic 方式(我不想使用大量嵌套 for 循环)是什么:
{
'a': ['1', '2'],
'b': ['1'],
'c': ['1', '2'],
}
IIUC,这是一种方法:
from collections import defaultdict
result = defaultdict(list)
for i in A:
a, b = i.split('-')
result[a].append(b)
输出:
defaultdict(list, {'a': ['1', '2'], 'b': ['1'], 'c': ['2', '1']})
注意:您也可以使用 setdefault
:
result = {}
for i in A:
a, b = i.split('-')
result.setdefault(a, []).append(b)
我会使用 map
和 reduce
:
from functools import reduce
reduce(
lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]},
map(lambda a: a.split("-"), A),
{}
)
说明
首先,我使用地图将 A
中的每个项目按 -
拆分。
map(lambda a: a.split("-"), A)
接下来,我把它变成字典。 lambda 获取字典和下一对值。我将字典解压到一个新字典中,然后使用值的第一项作为键,将字典中的当前值或空数组分配给它,并将其与当前值连接起来。
lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]}
您可以使用collections.defaultdict
from collections import defaultdict
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
dict3 = defaultdict(list)
for i in A:
one,two=i.split('-')
dict3[one].append(two)
print(dict(dict3))
您还可以这样做:
dict1={}
for j in A:
a,b=j.split('-')
if a in dict1:
dict1[a].append(b)
else:
dict1[a]=[b]
print(dict1)
myList,就是你的列表,它会把它倒入myDict:
myDict = {}
myList = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
for i in myList:
a, b = i.split('-')
if a in myDict:
myDict[a] += [b]
else:
myDict[a] = [b]
for j in myDict:
print(j, ' = ', myDict[j])
它把我设置为列表中的一个对象,然后用“-”分割键和值,如果存在相同的键,则将值添加到它的列表中,如果不存在, 它将生成密钥并设置值
输出:
a = ['1', '2']
b = ['1']
c = ['2', '1']
由于您希望字符串的第一个元素和最后一个元素分别成为输出字典的键和值,您可以简单地使用它们的索引访问它们
索引 0 是第一个,而索引 -1 是最后一个。
然后以列表作为参数创建一个空的默认字典
附加到字典,如下面的代码所示
from collections import *
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
dict = defaultdict(list)
for l in A:
p = l[0]
q = l[-1]
dict[p].append(q)
print(dict)
我有一个列表:
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
聚合字典(或任何其他数据结构)中的数据以获得如下结果的 pythonic 方式(我不想使用大量嵌套 for 循环)是什么:
{
'a': ['1', '2'],
'b': ['1'],
'c': ['1', '2'],
}
IIUC,这是一种方法:
from collections import defaultdict
result = defaultdict(list)
for i in A:
a, b = i.split('-')
result[a].append(b)
输出:
defaultdict(list, {'a': ['1', '2'], 'b': ['1'], 'c': ['2', '1']})
注意:您也可以使用 setdefault
:
result = {}
for i in A:
a, b = i.split('-')
result.setdefault(a, []).append(b)
我会使用 map
和 reduce
:
from functools import reduce
reduce(
lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]},
map(lambda a: a.split("-"), A),
{}
)
说明
首先,我使用地图将 A
中的每个项目按 -
拆分。
map(lambda a: a.split("-"), A)
接下来,我把它变成字典。 lambda 获取字典和下一对值。我将字典解压到一个新字典中,然后使用值的第一项作为键,将字典中的当前值或空数组分配给它,并将其与当前值连接起来。
lambda d, a: {**d, a[0]: d.get(a[0], []) + [a[1]]}
您可以使用collections.defaultdict
from collections import defaultdict
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
dict3 = defaultdict(list)
for i in A:
one,two=i.split('-')
dict3[one].append(two)
print(dict(dict3))
您还可以这样做:
dict1={}
for j in A:
a,b=j.split('-')
if a in dict1:
dict1[a].append(b)
else:
dict1[a]=[b]
print(dict1)
myList,就是你的列表,它会把它倒入myDict:
myDict = {}
myList = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
for i in myList:
a, b = i.split('-')
if a in myDict:
myDict[a] += [b]
else:
myDict[a] = [b]
for j in myDict:
print(j, ' = ', myDict[j])
它把我设置为列表中的一个对象,然后用“-”分割键和值,如果存在相同的键,则将值添加到它的列表中,如果不存在, 它将生成密钥并设置值
输出:
a = ['1', '2']
b = ['1']
c = ['2', '1']
由于您希望字符串的第一个元素和最后一个元素分别成为输出字典的键和值,您可以简单地使用它们的索引访问它们 索引 0 是第一个,而索引 -1 是最后一个。
然后以列表作为参数创建一个空的默认字典 附加到字典,如下面的代码所示
from collections import *
A = ['a-1', 'b-1', 'c-2', 'c-1', 'a-2']
dict = defaultdict(list)
for l in A:
p = l[0]
q = l[-1]
dict[p].append(q)
print(dict)