根据键将字典值组合在一起
Group dictionary values together based on a key
我希望将输入集中的值与作为键的元组中的第一个元素组合在一起。第二个元素需要根据公共键组合到一个列表中。输出需要是一个包含元组的列表。
# Input set
values = {(304008, 2020.0), (304008, 2017.0), (250128, 2020.0), (93646, 2020.0), (93646, 2017.0)}
# Current workflow
keys = {i[0] for i in values}
id_dict = dict()
for k in keys:
id_dict[k] = [int(i[1]) for i in values if i[0] == k]
lst2 = list(id_dict.items())
# Expected output
# [(250128, [2020]), (304008, [2017, 2020]), (93646, [2020, 2017])]
我有预期的输出,但整个过程太慢了。我希望让它更快。我正在查看 groupby 函数,但我似乎无法使它们工作。
您可以使用 itertools.groupby
来完成此操作。基本上按元组中的第一个元素分组,然后列出每个组中的第二个元素。
>>> from itertools import groupby
>>> [(k, [i[1] for i in g]) for k, g in groupby(sorted(values), key=lambda i: i[0])]
[(93646, [2017.0, 2020.0]), (250128, [2020.0]), (304008, [2017.0, 2020.0])]
您可以使用 setdefault 制作一个带有键的字典作为元组的第一项,并迭代该集合以一次性填充它。
使用列表构造函数来获取所需的列表。见下文:
>>> values = {(304008, 2020.0), (304008, 2017.0), (250128, 2020.0), (93646, 2020.0), (93646, 2017.0)}
>>> info = {}
>>> for elements in values:
... info.setdefault(elements[0], []).append(elements[1])
...
>>> list(info.items())
[(304008, [2017.0, 2020.0]), (93646, [2017.0, 2020.0]), (250128, [2020.0])]
>>>
这不使用 groupby 但避免了你的第二个循环。
我希望将输入集中的值与作为键的元组中的第一个元素组合在一起。第二个元素需要根据公共键组合到一个列表中。输出需要是一个包含元组的列表。
# Input set
values = {(304008, 2020.0), (304008, 2017.0), (250128, 2020.0), (93646, 2020.0), (93646, 2017.0)}
# Current workflow
keys = {i[0] for i in values}
id_dict = dict()
for k in keys:
id_dict[k] = [int(i[1]) for i in values if i[0] == k]
lst2 = list(id_dict.items())
# Expected output
# [(250128, [2020]), (304008, [2017, 2020]), (93646, [2020, 2017])]
我有预期的输出,但整个过程太慢了。我希望让它更快。我正在查看 groupby 函数,但我似乎无法使它们工作。
您可以使用 itertools.groupby
来完成此操作。基本上按元组中的第一个元素分组,然后列出每个组中的第二个元素。
>>> from itertools import groupby
>>> [(k, [i[1] for i in g]) for k, g in groupby(sorted(values), key=lambda i: i[0])]
[(93646, [2017.0, 2020.0]), (250128, [2020.0]), (304008, [2017.0, 2020.0])]
您可以使用 setdefault 制作一个带有键的字典作为元组的第一项,并迭代该集合以一次性填充它。 使用列表构造函数来获取所需的列表。见下文:
>>> values = {(304008, 2020.0), (304008, 2017.0), (250128, 2020.0), (93646, 2020.0), (93646, 2017.0)}
>>> info = {}
>>> for elements in values:
... info.setdefault(elements[0], []).append(elements[1])
...
>>> list(info.items())
[(304008, [2017.0, 2020.0]), (93646, [2017.0, 2020.0]), (250128, [2020.0])]
>>>
这不使用 groupby 但避免了你的第二个循环。