检查列表中的对?

时间:2017-03-09 07:57:08

标签: python list

基本上我有一个程序,它会取一个数字并将其减少到最小数字,即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]

所以,有四个。而这又会产生两对,它们会添加到一个列表中,但只需要将一个数字添加到代表一对的列表中。

5 个答案:

答案 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, 33, 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]