寻找一种花哨的单行解决方案,以使用列表理解来查找列表中的项目对。
我有一些找到倍数的代码,但无法弄清楚如何将这些倍数成对。
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
。
答案 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
,并添加其对数。