检查列表中的所有元素是否都是唯一的

时间:2011-03-11 20:44:29

标签: python algorithm list unique

检查列表中的所有元素是否都是唯一的最佳方式(最好的方式)(<传统方式)?

我目前使用Counter的方法是:

>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
        if values > 1: 
            # do something

我可以做得更好吗?

14 个答案:

答案 0 :(得分:140)

不是最有效,但直截了当的简洁:

if len(x) > len(set(x)):
   pass # do something

对于短名单,可能不会产生太大影响。

答案 1 :(得分:87)

这是一个双线,也将提前退出:

>>> def allUnique(x):
...     seen = set()
...     return not any(i in seen or seen.add(i) for i in x)
...
>>> allUnique("ABCDEF")
True
>>> allUnique("ABACDEF")
False

如果x的元素不可用,那么您将不得不求助于使用seen的列表:

>>> def allUnique(x):
...     seen = list()
...     return not any(i in seen or seen.append(i) for i in x)
...
>>> allUnique([list("ABC"), list("DEF")])
True
>>> allUnique([list("ABC"), list("DEF"), list("ABC")])
False

答案 2 :(得分:20)

提前退出的解决方案可能是

def unique_values(g):
    s = set()
    for x in g:
        if x in s: return False
        s.add(x)
    return True
然而,对于小案例或早期退出不是常见情况,我希望len(x) != len(set(x))是最快的方法。

答案 3 :(得分:12)

速度:

import numpy as np
x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
np.unique(x).size == len(x)

答案 4 :(得分:10)

如何将所有条目添加到集合并检查其长度?

len(set(x)) == len(x)

答案 5 :(得分:9)

替代set,您可以使用dict

len({}.fromkeys(x)) == len(x)

答案 6 :(得分:2)

完全另一种方法,使用sorted和groupby:

from itertools import groupby
is_unique = lambda seq: all(sum(1 for _ in x[1])==1 for x in groupby(sorted(seq)))

它需要排序,但退出第一个重复值。

答案 7 :(得分:2)

这是一个递归的早退函数:

def distinct(L):
    if len(L) == 2:
        return L[0] != L[1]
    H = L[0]
    T = L[1:]
    if (H in T):
            return False
    else:
            return distinct(T)    

对我而言,如果没有使用奇怪的(慢速)转换,这对我来说足够快 采用功能风格的方法。

答案 8 :(得分:2)

这是一个递归的O(N 2 )版本的乐趣:

def is_unique(lst):
    if len(lst) > 1:
        return is_unique(s[1:]) and (s[0] not in s[1:])
    return True

答案 9 :(得分:1)

这个怎么样

def is_unique(lst):
    if not lst:
        return True
    else:
        return Counter(lst).most_common(1)[0][1]==1

答案 10 :(得分:1)

在Pandas数据框架中使用类似的方法来测试列的内容是否包含唯一值:

if tempDF['var1'].size == tempDF['var1'].unique().size:
    print("Unique")
else:
    print("Not unique")

对我来说,这是一个包含超过一百万行的日期框架中的int变量的瞬间。

答案 11 :(得分:0)

你可以使用Yan的语法(len(x)&gt; len(set(x))),而不是set(x),定义一个函数:

 def f5(seq, idfun=None): 
    # order preserving
    if idfun is None:
        def idfun(x): return x
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        # in old Python versions:
        # if seen.has_key(marker)
        # but in new ones:
        if marker in seen: continue
        seen[marker] = 1
        result.append(item)
    return result

并且执行len(x)&gt; LEN(F5(x)的)。这将是快速的,也是订单保留。

代码取自:http://www.peterbe.com/plog/uniqifiers-benchmark

答案 12 :(得分:0)

以上所有答案都不错,但我更喜欢使用30 seconds of python

中的 all_unique 示例

您需要在给定列表上使用set()删除重复项,将其长度与列表长度进行比较。

def all_unique(lst):
  return len(lst) == len(set(lst))

如果平面列表中的所有值均为True,则返回unique,否则返回False

x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False

答案 13 :(得分:-4)

对于begginers:

def AllDifferent(s):
    for i in range(len(s)):
        for i2 in range(len(s)):
            if i != i2:
                if s[i] == s[i2]:
                    return False
    return True