3

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

4

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

c在执行之前创建[length - c[el] for el in li]比对列表中的每个元素 i 执行更好count(i),因为这意味着count()多次执行相同的计数(每次遇到给定元素时,它都会计数)

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

map(lambda x: length-c[x] , li)
于 2013-02-17T00:08:31.830 回答
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]
于 2013-02-17T00:07:01.113 回答
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]
于 2013-02-17T00:08:26.910 回答
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仍然可以迭代它们并产生所需的结果。但是请注意,一旦您对生成器进行了一次迭代,就不能再次对其进行迭代。

于 2013-02-17T00:21:59.847 回答