将列表中的每个元素与其他所有元素进行比较

3

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


“从这个列表中添加数字”是什么意思?您想要对它们进行“求和”,还是其他操作? - Volatility
我的意思是,从结果列表[6,7,7,7,6,7,7,7,6]中,我想要将6+7+7...相加,以得到列表中元素的总和。 - user2079480
4个回答

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]之前创建c比对列表中每个元素i执行count(i)更好,因为这意味着count()会多次进行相同的计数(每次遇到给定元素时都会计数)。顺便说一句,另一种写法:
map(lambda x: length-c[x] , li)

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]

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 这样的函数仍然可以遍历它们并产生所需的结果。请注意,一旦您对生成器进行了一次迭代,就无法再次迭代。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接