2013-02-17 169 views
3

有没有一种方法可以比较列表中的所有元素(即[4,3,2,1,4,3,2,1,4]之一)到所有元素其他人,并返回,为每个元素,其他元素的数量是不同的(例如,[6,7,7,7,6,7,7,7,6]上面的列表)?然后我需要添加这个列表中的数字。将列表中的每个元素与所有其他元素进行比较

+0

你是什么意思'从这个列表中添加数字'?你想“总结”他们还是其他的东西? – Volatility 2013-02-17 00:08:51

+0

我的意思是,从结果列表[6,7,7,7,6,7,7,7,6]我想要添加6 + 7 + 7 ....以产生元素的总和在名单 – user2079480 2013-02-17 00:19:50

回答

2

您可以通过count()方法获得类似的计数器。
然后减去总数。
与理解列表一行。

>>> l = [4, 3, 2, 1, 4, 3, 2, 1, 4] 
>>> [ len(l)-l.count(i) for i in l ] 
[6, 7, 7, 7, 6, 7, 7, 7, 6] 
1

对于Python 2.7:

test = [4, 3, 2, 1, 4, 3, 2, 1, 4] 
length = len(test) 
print [length - test.count(x) for x in test] 
3
li = [4, 3, 2, 1, 4, 3, 2, 1, 4] 

from collections import Counter 

c = Counter(li) 
print c 
length = len(li) 

print [length - c[el] for el in li] 

执行[length - c[el] for el in li]比做count(i)的名单我每个元素好转之前创建c,因为这意味着count()做同样的计数几次(每遇到一个给定的元素,它就会计算它)

顺便说一句,另一种写法:

map(lambda x: length-c[x] , li) 
0

您可以使用sum函数以及生成器表达式。

>>> l = [4, 3, 2, 1, 4, 3, 2, 1, 4] 
>>> length = len(l) 
>>> print sum(length - l.count(i) for i in l) 
60 

约发电机表达的好处是,你没有在内存中创建一个实际的名单,但像sum功能仍然可以在它们之间迭代,并产生期望的结果。但是请注意,一旦迭代了一次生成器,就不能再次迭代它。

相关问题