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(), 项目被重复,因此您可能无法将所有值存储在字典中,因为item1&item2被重复:

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 回答