![](/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.