動作しません、あなたの最初のアプローチは、あなたが返されるグループがあるthe groupby
docs
から引用すると
list(groupby("cccccaaaaatttttsssssss"))
と、そのリストを作成するときのグループが「消費」を得ることである理由それ自体は、 を反復可能で、groupby()
で共有するイテレータです。ソースが共有されているため、 groupby()
オブジェクトがアドバンスされている場合、前のグループはもはや が表示されなくなります。
ステージに分割しましょう。
from itertools import groupby
a = list(groupby("cccccaaaaatttttsssssss"))
print(a)
b = a[0][1]
print(b)
print('So far, so good')
print(list(b))
print('What?!')
出力
[('c', <itertools._grouper object at 0xb715104c>), ('a', <itertools._grouper object at 0xb715108c>), ('t', <itertools._grouper object at 0xb71510cc>), ('s', <itertools._grouper object at 0xb715110c>)]
<itertools._grouper object at 0xb715104c>
So far, so good
[]
What?!
それがgroupby
によって返された「親」イテレータと、その内容を共有するために私たちのitertools._grouper object at 0xb715104c
が空で、その最初のlist
通話がかけ反復するので、これらのアイテムは、現在なくなっています親。
単純なジェネレータ式のように、どのイテレータでも2回反復しようとすると、どうなるでしょうか。
g = (c for c in 'python')
print(list(g))
print(list(g))
出力
['p', 'y', 't', 'h', 'o', 'n']
[]
はところで、ここにあなたが実際にその内容を必要としない場合groupby
グループの長さを取得する別の方法です。それはちょうどその長さを見つけるためにリストを構築するよりも少し安いです(そして、より少ないRAMを使用します)。
from itertools import groupby
for k, g in groupby("cccccaaaaatttttsssssss"):
print(k, sum(1 for _ in g))
出力
c 5
a 5
t 5
s 7
これは偉大な説明です。本当にありがとう! – cafemolecular