2012-11-26 27 views
1

例如发生在一排相同的经常性项目,我们有这样的名单:分组,从列表

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

我想将它们打包成形式的元组的列表:

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

我已经开发了一种算法,该算法有类似的功能,可以得到:

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

(它找到的所有事件和它们计数,即使它们不是邻居...)

但是,我希望它只将那些具有相同的项目分组为邻居(即,一起发生),我怎么能做到这一点?

这不是我不知道该怎么做,而是我倾向于编写长的代码,我希望在这种情况下使用一个优雅而简单的解决方案。

+0

'ITEM1:1,ITEM2:1,项目3:3 .... ITEM1:1'将不是字典......(它有多个相同的密钥) –

+0

对不起。那是真实的。忽略我写过的必须是字典的事实。这不是要求。它可以是元组的形式。所以顺序是重要的课程。 – RecursionSnake

回答

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 
+0

在这种情况下不需要键功能。 –

+0

@你说得对,只是看到列夫列维茨基的回答。 –

+0

太棒了。谢谢。我确实在寻找groupby功能。是的,对于关键的lambda函数是没有用的。它的工作原理绝对完美无缺:) – RecursionSnake

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)] 
+0

'len(list(g))'短于'sum(1 for _in g)',无论如何+1。 –

+0

@AshwiniChaudhary它更短,但我认为它可以更快;我倾向于认为避免创建一个列表来计算其元素是个好主意。感谢您的支持:) –

+2

好的一点,jut给他们定时,'sum(1 for _in g)'

0
python 3.2 
from itertools import groupby 

>>> [(i,(list(v)).count(i)) for i,v in groupby(L)]