使用列表理解仅在列表中查找对

时间:2019-05-15 07:42:26

标签: python list-comprehension

寻找一种花哨的单行解决方案,以使用列表理解来查找列表中的项目对。

我有一些找到倍数的代码,但无法弄清楚如何将这些倍数成对。

lst = [1,2,4,2,2,3,3,1,1,1,2,4,3,4,1]
len(set([x for x in lst if lst.count(x) > 1]))

上面的代码返回4。答案应该是6对,[1,1,1,1,1] = 2[2,2,2,2] = 2[3,3,3] = 1[4,4,4] = 1

3 个答案:

答案 0 :(得分:3)

另一种方法是使用[Python 3.Docs]: class collections.Counter([iterable-or-mapping])

>>> from collections import Counter
>>>
>>> lst = [1, 2, 4, 2, 2, 3, 3, 1, 1, 1, 2, 4, 3, 4, 1]
>>>
>>> c = Counter(lst)
>>> c
Counter({1: 5, 2: 4, 4: 3, 3: 3})
>>>
>>> sum(item // 2 for item in c.values())
6

和一行等效:

>>> sum(item // 2 for item in Counter(lst).values())
6

答案 1 :(得分:1)

您可以执行以下操作(如果我正确理解了您的配对方法):

lst = [1,2,4,2,2,3,3,1,1,1,2,4,3,4,1]
the_dict = {x: int((lst.count(x)/2)) for x in lst}

print(sum(the_dict.values()))

> 6

print(the_dict)

> {1: 2, 2: 2, 4: 1, 3: 1}

这将使字典具有所有对的计数,然后您可以对字典中的值求和以获得对计数。然后,如果需要,您还可以使用带有每个值对计数的字典。

答案 2 :(得分:1)

没有其他中间变量的单线将是:

sum(lst.count(x)//2 for x in set(lst))

它循环遍历set(lst)中包含所有不同数字的lst,并添加其对数。