Python 检查列表是否有唯一重复的元素(即,没有唯一的元素)

Python 检查列表是否有唯一重复的元素(即,没有唯一的元素),python,list,Python,List,我有一个偶数ints的数组,我想检查这些元素是否都是“成对的”,即[0,1,0,1]有一对1s和一对0s vs[0,1,1,2]只有一个0和一个2 我的第一个想法是把它投到一组中,然后检查这组的长度是否是原来的一半: def isPaired(arr): return len(arr) / 2 == len(set(arr) 但如果arr是[0,1,0,0],则这是不正确的 我的下一个想法是对数组进行排序,并将每个偶数索引与下一个索引进行比较: def isPaired(arr):

我有一个偶数
int
s的数组,我想检查这些元素是否都是“成对的”,即
[0,1,0,1]
有一对
1
s和一对
0
s vs
[0,1,1,2]
只有一个
0
和一个
2

我的第一个想法是把它投到一组中,然后检查这组的长度是否是原来的一半:

def isPaired(arr):
    return len(arr) / 2 == len(set(arr)
但如果arr是
[0,1,0,0]
,则这是不正确的

我的下一个想法是对数组进行排序,并将每个偶数索引与下一个索引进行比较:

def isPaired(arr):
    arr.sort
    for i in range(0, len(arr) - 1):
        if i % 2 == 0 && arr[i] != arr[i+1]:
            return False
    return True

这是可行的,但运行时至少是排序的运行时。没有对数组排序的情况下,是否有解决此问题的方法?

您可以使用如下
计数器:

from collections import Counter
all(c % 2 == 0 for c in Counter([0, 1, 0, 1]).values())
# True
您还可以对连续元素进行排序,然后进行比较:

l = sorted([0, 1, 0, 1])
all(x == y for x, y in zip(l[::2], l[1::2]))
# True
复杂性方面,首选第一个选项,因为其最坏情况下的复杂性仅为线性。

这将使用更少的内存:

def have_pairs(a):
    temp_dict = dict()
    for i in a:
        if i in temp_dict:
            temp_dict[i] += 1
        else:
            temp_dict[i] = 1
    frequency = temp_dict.values()
    pairs = True
    for i in frequency:
        if i % 2 == 1:
            pairs = False
            break
    return pairs


a = [1, 1, 2, 3, 3, 2]
print(have_pairs(a))
# True

a = [1, 1, 2, 3, 3]
print(have_pairs(a))
# False
INPUT = [0, 1, 0 , 1]

odd = set()
for n in INPUT:
    if n in odd: 
        odd.remove(n)
    else:
        odd.add(n)

print(not odd)

它接受两对
[1,1,1,1]

您可以创建一个字典,将数字保留为键,将值保留为计数。最后,您需要确保所有值均为偶数(以形成成对)@newbie,即
集合
packageCool中的
计数器
。这实际上在许多地方非常有用。使用计数器,您只需检查元素总数(数组大小的一半),最常见(2)@njzk2的计数不一定,因为
[0,0,0,0,2]
也可能是有效的输入。除非我误解了你的意思。这是OP没有指明的,尽管这是一个有效的问题:4个项目算作2对,还是根本不算作一对。但是考虑到OP发布的当前实现,我认为你是对的