![](/img/trans.png)
[英]Using itertools groupby to find the group of all even numbers in a list
[英]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
函数迭代另一个可迭代项,例如使用原始s
和g
:
>>> 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.