基本上我有一个程序,它会取一个数字并将其减少到最小数字,即2,3,5,7等等。我无法弄清楚如何检查列表中是否有一对或多对数字。例如。
myList = [1,1,1,4,5,6,6,3,3,1]
在myList中,有四个1,它们是两对,两对。然后需要将对抛出到另一个列表中,但不是添加两个数字使它成为一对,它只需要有一对数字。
例如:
myList = [1,1,1,4,5,6,6,3,3,1]
doubles = [1,1,6,3]
所以,有四个。而这又会产生两对,它们会添加到一个列表中,但只需要将一个数字添加到代表一对的列表中。
答案 0 :(得分:2)
这类似于qarma的第一个解决方案,但它避免了双for
循环。
from collections import Counter
my_list = [1, 1, 1, 4, 5, 6, 6, 3, 3, 1, 7, 7, 7]
doubles = []
for k, v in Counter(my_list).items():
doubles.extend([k] * (v // 2))
print(doubles)
<强>输出强>
[1, 1, 6, 3, 7]
答案 1 :(得分:1)
这样的东西?
>>> myList = [1,1,1,4,5,6,6,3,3,1]
>>> mySet = set()
>>> doubles = []
>>> for i in myList:
... if i in mySet:
... doubles.append(i)
... mySet.remove(i)
... else:
... mySet.add(i)
...
>>> doubles
[1, 6, 3, 1]
注意 - 这不会保留您在问题中所期望的顺序,即[1, 1, 6, 3]
。
答案 2 :(得分:1)
[k for k, v in collections.Counter([1,1,1,4,5,6,6,3,3,1]).items() for _i in range(v // 2)]
[1, 1, 3, 6]
Counter
是一种字典,因此不会保持插入顺序。此外,它会压缩输入,因此,例如1, 1, 3, 3, 1, 1
之类的输入可以保证导致1, 1, 3
或3, 1, 1
,而不会1, 3, 1
。
In [7]: def pairs(s):
...: queue = set()
...: for i in s:
...: if i in queue:
...: yield i
...: queue.remove(i)
...: else:
...: queue.add(i)
...:
In [8]: list(pairs([1,1,1,4,5,6,6,3,3,1]))
Out[8]: [1, 6, 3, 1]
这保留了对的顺序,但是根据一对中的最后一项来排序,例如, 1, 9, 9, 1
变为9, 1
。
In [12]: def pairs(s):
...: incomplete = dict()
...: done = []
...: for i, v in enumerate(s):
...: if v in incomplete:
...: done.append((incomplete[v], v))
...: del incomplete[v]
...: else:
...: incomplete[v] = i
...: return [v[1] for v in sorted(done)]
...:
...:
In [13]: pairs([1,1,1,4,5,6,6,3,3,1])
Out[13]: [1, 1, 6, 3]
这里,每对第一个元素的原始位置保留为incomplete
dict中的值,允许根据一对中的第一项重建原始顺序。
答案 3 :(得分:0)
使用defaultdictionary
from collections import defaultdict
def func(lis):
dic = defaultdict(int)
for i in lis:
dic[i]+=1
list1 =[]
for k,v in dic.items():
if v>=2:
list1.append([k]*(v//2))
return list1
myList = [1,1,1,4,5,6,6,3,3,1]
data = [j for i in func(myList) for j in i]
print(data)
# output
# [1,1,6,3]
答案 4 :(得分:0)
带有Counter
的另一个选项:
from collections import Counter
myList = [1,1,1,4,5,6,6,3,3,1]
dupes = Counter({k: v // 2 for k, v in Counter(myList).items()})
sorted(dupes.elements())
# [1, 1, 3, 6]