2011-11-06 66 views
-3

我有一个(很长的)名单,这个结构:我如何计算列表中标识元素的数量?

li1 = [[1.4, b][1.5, a][1.6, c][1,4, b][1.7,c][1.4, a][1.6,c]] 

我想写一个循环,计算元件的数量,li1[i][0]`具有相同的价值,并提出在新的列表信息,如这样的:

li2 = [[1.4, 3][1.5, 1][1.6, 2][1.7, 1]] 

,我的问题是,我不知道还有什么价值,或者有多少不同的价值观,我在寻找..

谢谢

回答

0

由于您只关心列表的第一个值,因此第一步是从每个子列表中提取它(顺便提一下,它应该是tupels)。

>>> a,b,c = 'abc' 
>>> li1 = [[1.4, b], [1.5, a], [1.6, c], [1,4, b], [1.7, c], [1.4, a], [1.6, c]] 
>>> firsts = map(lambda sublist: sublist[0], li1) 

map使用第二个参数的元素调用它的第一个参数。由于这里的第一个参数是一个anonymous function (lambda)返回其参数的第一个元素,首创的值现在为这些第一元素的列表:

>>> firsts 
[1.4, 1.5, 1.6, 1, 1.7, 1.4, 1.6] 

或者,你也可以使用一个list comprehension来写同样的事情以不同的方式:

>>> firsts = [sublist[0] for sublist in li1] 
>>> firsts 
[1.4, 1.5, 1.6, 1, 1.7, 1.4, 1.6] 

地图的结果(在Python 2)和列表解析是存储在内存中的列表。这对我们的小名单li1没有任何问题,但可以成为大型输入列表中的一个。因为我们只想要一次算值,我们并不真正需要存储它们,因此可以(在时间,这“计算”每个值)使用generator expression

>>> first = (sublist[0] for sublist in li1) 

firsts现在是一个生成器对象从中我们可以得到第一个值。

现在,进入计数。幸运的是,Python的2.6 +提供了一个Counter类,我们可以使用:

>>> import collections 
>>> counter = collections.Counter(firsts) 
>>> counter.most_common() 
[(1.4, 2), (1.6, 2), (1.5, 1), (1.7, 1), (1, 1)] 

注意,结果表示为tupels,这可能是你想要什么反正。如果你真的需要一个列表(例如,由于要追加东西的元素),使用map做一个列表出来的每个元组:

>>> map(list, counter.most_common()) 
[[1.4, 2], [1.6, 2], [1.5, 1], [1.7, 1], [1, 1]] 


综上所述,短期办法写这一切:

import collections 
a,b,c = 'abc' 
li1 = [[1.4, b], [1.5, a], [1.6, c], [1,4, b], [1.7, c], [1.4, a], [1.6, c]] 
li2 = collections.Counter(sublist[0] for sublist in li1).most_common() 
+0

这只是用'类型错误:unhashable类型:“list''并不会接近到什么OP是要求(计重复) 。 – delnan

+0

-1仔细阅读。这仍然不符合OP的要求。它只是完全删除重复的元组,而不是计算重复的第一项。 – delnan

+0

@delnan更新了一个解决方案,它的确包括了一些解决方案,包括一些关于它如何和为什么起作用的解释,并且使用'most_common'而不是'items'来得到按发生次序排序的结果。 – phihag

3
from collections import Counter 
a, b, c = 'abc' 
li1 = [[1.4, b], [1.5, a], [1.6, c], [1.4, b], [1.7, c], [1.4, a], [1.6, c]] 
sorted(Counter(x[0] for x in li1).items()) 

maplist到这一点,如果你迫切希望列表的列表。)

+0

非常感谢! – user1032444

0
>>> li1 = [[1.4, 'b'],[1.5, 'a'],[1.6, 'c'],[1.4, 'b'],[1.7,'c'],[1.4, 'a'],[1.6,'c']] 

首先,我们创建一个像(1.4,'b')键和值表示在最初的名单是关键要素的数量词典:

>>> d = {} 
>>> for el in li1: 
    el = el[0] 
    d[el] = d.get(el,0) + 1 

所以,字典是这样的:

>>> d 
{1.5: 1, 1.4: 3, 1.7: 1, 1.6: 2} 

另外,请注意,使用d.get。因为最初字典中不包含任何元素,所以当没有元素时(第二个参数为get),返回0。还有其他技术可以实现此行为:您可以使用DefalutDictCounter,正如其他答案中所用。

然后我们使用字典创造必要的名单:

>>>[[key,value] for key,value in d.items()] 
[[1.5, 1], [1.4, 3], [1.7, 1], [1.6, 2]]