检查列表中是否包含完全重复的元素(即没有唯一元素)

时间:2019-10-26 06:02:02

标签: python list

我有一个偶数个int的数组,想检查所有这些元素是否都“成对”,即[0, 1, 0, 1]有一对1和一个一对0[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

这可行,但是运行时至少是排序的运行时。如果不对数组进行排序,是否可以解决此问题?

3 个答案:

答案 0 :(得分:4)

您可以像这样使用Counter

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

明智地选择复杂度,因为它在最坏的情况下复杂度仅是线性的,因此首选第一种。

答案 1 :(得分:1)

这将使用较少的内存:

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]作为两对。

答案 2 :(得分:0)

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