2

たとえば、次のようなリストがあります。

L = ["item1", "item2", "item3", "item3", "item3", "item1", "item2", "item4", "item4", "item4"]

それらをフォームのタプルのリストにパックしたい:

[("item1", 1), ("item2", 1), ("item3", 3),... ("item1", 1)]

私はすでに似たようなことをするアルゴリズムを開発しました:

{item1: 2, item2: 2, ...}

(それらが隣接していなくても、すべての出現を見つけてカウントします...)

ただし、同じものを持ち、隣接している (つまり、一緒に並んでいる)アイテムのみをグループ化したいのですが、どうすればこれを達成できますか?

方法がわからないわけではありませんが、長いコードを書く傾向があり、この場合はエレガントで単純なソリューションが必要です。

4

3 に答える 3

5

これもitertools.groupby(ジェネレーターバージョン)を使用しています:

from itertools import groupby
counts = ((k, sum(1 for _ in g)) for k, g in groupby(l))
>>> list(counts)
[('item1', 1),
 ('item2', 1),
 ('item3', 3),
 ('item1', 1),
 ('item2', 1),
 ('item4', 3)]
于 2012-11-26T13:02:16.190 に答える
4

を使用すると、アイテムが繰り返されるため、 &が繰り返さitertools.groupby()れるため、すべての値を辞書に格納できない場合があります。item1item2

In [21]: l = ["item1", "item2", "item3", "item3", "item3", "item1", "item2", "item4", "item4", "item4"]

In [22]: for k,g in groupby(l):
    print "{0}:{1}".format(k,len(list(g)))
   ....:     
item1:1
item2:1
item3:3
item1:1
item2:1
item4:3
于 2012-11-26T13:00:25.860 に答える
0
python 3.2
from itertools import groupby

>>> [(i,(list(v)).count(i)) for i,v in groupby(L)]
于 2012-11-26T13:44:45.170 に答える