gpt4 book ai didi

Python:如果第一个元素是其他元素的元组

转载 作者:太空狗 更新时间:2023-10-30 02:37:57 24 4
gpt4 key购买 nike

很抱歉,如果之前有人问过这个问题,但我找不到。如果我有类似的东西:

lst = [(('a', 'b'), 1, 2), (('a', 'b'), 3, 4), (('b', 'c'), 5, 6)]

我想获得一个较短的列表:

new = [(('a', 'b'), (1, 3), (2, 4)), (('b', 'c'), 5, 6)]

以便它通过第一个匹配元素将元组中的其他元素组合在一起,最快的方法是什么?

最佳答案

您正在分组,基于一个键。如果您的输入组总是连续的,您可以使用 itertools.groupby(),否则使用字典对元素进行分组。如果顺序很重要,请使用保留插入顺序的字典(> Python 3.6 dictcollections.OrderedDict)。

使用 groupby():

from itertools import groupby
from operator import itemgetter

new = [(k, *zip(*(t[1:] for t in g))) for k, g in groupby(lst, key=itemgetter(0))]

上面使用 Python 3 语法从可迭代的 (..., *iterable) 插入元组元素。

使用字典:

groups = {}
for key, *values in lst:
groups.setdefault(key, []).append(values)
new = [(k, *zip(*v)) for k, v in groups.items()]

在 Python 3.6 或更新版本中,这将保留组的输入顺序。

演示:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> lst = [(('a', 'b'), 1, 2), (('a', 'b'), 3, 4), (('b', 'c'), 5, 6)]
>>> [(k, *zip(*(t[1:] for t in g))) for k, g in groupby(lst, key=itemgetter(0))]
[(('a', 'b'), (1, 3), (2, 4)), (('b', 'c'), (5,), (6,))]
>>> groups = {}
>>> for key, *values in lst:
... groups.setdefault(key, []).append(values)
...
>>> [(k, *zip(*v)) for k, v in groups.items()]
[(('a', 'b'), (1, 3), (2, 4)), (('b', 'c'), (5,), (6,))]

如果您使用的是 Python 2,则必须使用:

new = [(k,) + tuple(zip(*(t[1:] for t in g))) for k, g in groupby(lst, key=itemgetter(0))]

from collections import OrderedDict
groups = OrderedDict()
for entry in lst:
groups.setdefault(entry[0], []).append(entry[1:])
new = [(k,) + tuple(zip(*v)) for k, v in groups.items()]

关于Python:如果第一个元素是其他元素的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com