gpt4 book ai didi

python - 对两个值的元组列表进行分组,并返回所有第三个值的列表

转载 作者:太空狗 更新时间:2023-10-30 01:47:31 26 4
gpt4 key购买 nike

我有一个元组列表,每个元组包含三个值。我想“将它们卷起来”或对它们进行分组,以便对于前两个值相同的所有元组,它将返回一个列表列表,其中每个组件列表包含:1:第一个值,2:第二个值,3 : 与前两个匹配的所有第三个值的列表。

因为我在这里编写整个脚本,所以我在数据类型上有一定的灵 active ,所以如果我以完全错误的方式处理它,请告诉我。我确实想知道使用 Pandas 是否有更简单的方法来完成它。

我想知道是否可以使用 itertools.groupby() 来实现这一点。我认为它可能需要与 operator.itemgetter() 结合使用才能访问各种元组的正确部分。

import itertools
import operator

list = [(1, 1, 4), (1, 1, 9), (1, 1, 14), (2, 1, 12), (2, 1, 99), (2, 6, 14), (2, 6, 19)]

list=sorted(list)

def sorter(list):
grouper = itertools.groupby(list, operator.itemgetter(0))
for key, subiter in grouper:
l = []
grouper2 = itertools.groupby(subiter, operator.itemgetter(0))
for key, subiter in grouper2:
l.append(subiter)
yield key, l

这段代码代表了我正在考虑的大体方向,但它不会产生所需的输出。所需的输出是:

[[1, 1, [4, 9, 14]], [2, 1, [12, 99]], [2, 6, [14, 19]]]

同样,我在这里的数据类型方面具有很大的灵 active ,所以如果我遇到这个错误,我愿意尝试一些完全不同的东西。

最佳答案

无需使用两个嵌套的 groupby 分组按单个字段。而是使用带有两个参数的 itemgetter 或一个 lambda 来同时按前两个值进行分组,然后使用列表理解来获取最终元素。

>>> from itertools import groupby
>>> from operator import itemgetter
>>> lst = [(1, 1, 4), (1, 1, 9), (1, 1, 14), (2, 1, 12), (2, 1, 99), (2, 6, 14), (2, 6, 19)]
>>> [(*k, [x[2] for x in g]) for k, g in groupby(lst, key=itemgetter(0, 1))]
[(1, 1, [4, 9, 14]), (2, 1, [12, 99]), (2, 6, [14, 19])]

如果出于某种原因,你使用两个单独的groupby,你可以使用这个:

>>> [(k1, k2, [x[2] for x in g2]) for k1, g1 in groupby(lst, key=itemgetter(0))
... for k2, g2 in groupby(g1, key=itemgetter(1))]
[(1, 1, [4, 9, 14]), (2, 1, [12, 99]), (2, 6, [14, 19])]

当然,这也可以用作常规(嵌套)循环,更符合您的原始代码:

def sorter(lst):
for k1, g1 in groupby(lst, key=itemgetter(0)):
for k2, g2 in groupby(g1, key=itemgetter(1)):
yield (k1, k2, [x[2] for x in g2])

或者使用单个 groupby,返回一个生成器对象:

def sorter(lst):
return ((*k, [x[2] for x in g]) for k, g in groupby(lst, key=itemgetter(0, 1)))

一如既往,这假定 lst 已经通过相同的 key 排序。如果不是,请先排序。

关于python - 对两个值的元组列表进行分组,并返回所有第三个值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910431/

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