繁体   English   中英

Itertools groupby使用另一个列表对列表进行分组

[英]Itertools groupby to group list using another list

在熊猫中,您可以使用长度相等的Series来将GroupBy另一个GroupBy一起使用,例如:

s = pd.Series([1,1,1,-2,-4,-3,1,2])
g = np.sign(s).diff().fillna(0).abs().cumsum()
s.groupby(g).count()

0.0    3
2.0    3
4.0    2
dtype: int64

是否可以使用itertools.groupby做同样的事情? 因此,使用另一个列表从当前列表创建组吗? 还是使用一些密钥? 只要能使我想到如何解决这种情况[1,1,1,-2,-4,-3,1,2]以根据唱歌创建组就很好了。

预期产量:

[3,3,2]

您可以执行以下操作:

from itertools import groupby


data =  [1,1,1,-2,-4,-3,1,2]

result = [sum(1 for _ in group) for _, group in groupby(data, lambda x: x<= 0)]
print(result)

产量

[3, 3, 2]

语句: sum(1 for _ in group)计算sum(1 for _ in group)中元素的数量。 密钥lambda x: x<= 0符号函数。

对于根据匹配值将一个可迭代项分组为另一个可迭代项的一般情况,您可以使一个作弊key函数迭代另一个可迭代项,例如使用原始sg

>>> from itertools import groupby
>>> print([(k, len(list(grp))) for k, grp in groupby(s, key=lambda _, ig=iter(g): next(ig))])
[(0.0, 3), (2.0, 3), (4.0, 2)]

key函数从s接受值并忽略它,而不是从手动迭代g返回匹配值(默认的第二个参数缓存从g创建的迭代器,然后每次使用next手动将其前进;将第二个参数传递给next以静默忽略不匹配的长度,而只是替换为默认值)。

显然,对于这种特定情况,有更好的方法 ,但是我在回答所问的一般问题,而不是特定示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM