如何让列表只包含Python中的独特元素?


Answers

http://www.peterbe.com/plog/uniqifiers-benchmark修改版本

保存顺序:

def f(seq): # Order preserving
  ''' Modified version of Dave Kirby solution '''
  seen = set()
  return [x for x in seq if x not in seen and not seen.add(x)]

好的,现在它是如何工作的,因为if x not in seen and not seen.add(x)这里有点棘手if x not in seen and not seen.add(x)

In [1]: 0 not in [1,2,3] and not print('add')
add
Out[1]: True

为什么它返回True? print(和set.add)不返回任何内容:

In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>

not None == True ,但:

In [2]: 1 not in [1,2,3] and not print('add')
Out[2]: False

为什么它会在[1]中打印'添加',而不是在[2]中打印? 请参阅False and print('add') ,并且不检查第二个参数,因为它已经知道答案,并且只有在两个参数都为True时才返回true。

更通用的版本,更具可读性,基于生成器,增加了使用函数转换值的能力:

def f(seq, idfun=None): # Order preserving
  return list(_f(seq, idfun))

def _f(seq, idfun=None):  
  ''' Originally proposed by Andrew Dalke '''
  seen = set()
  if idfun is None:
    for x in seq:
      if x not in seen:
        seen.add(x)
        yield x
  else:
    for x in seq:
      x = idfun(x)
      if x not in seen:
        seen.add(x)
        yield x

没有订单(更快):

def f(seq): # Not order preserving
  return list(set(seq))
Question

这个问题在这里已经有了答案:

我有一个Python列表,我怎样才能使它的值是唯一的?




字典理解如何?

>>> mylist = [3, 2, 1, 3, 4, 4, 4, 5, 5, 3]

>>> {x:1 for x in mylist}.keys()
[1, 2, 3, 4, 5]

编辑到@丹尼的评论:我原来的建议并没有保持订购的钥匙。 如果您需要排序的密钥,请尝试:

>>> from collections import OrderedDict

>>> OrderedDict( (x,1) for x in mylist ).keys()
[3, 2, 1, 4, 5]

它通过元素的第一次出现保持元素的顺序(未广泛测试)




Python中的集合的特征是集合中的数据项是无序的,并且不允许重复。 如果您尝试将数据项添加到已包含数据项的集合中,则Python将忽略它。

>>> l = ['a', 'a', 'bb', 'b', 'c', 'c', '10', '10', '8','8', 10, 10, 6, 10, 11.2, 11.2, 11, 11]
>>> distinct_l = set(l)
>>> print(distinct_l)
set(['a', '10', 'c', 'b', 6, 'bb', 10, 11, 11.2, '8'])



保存顺序:

l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]



如果列表中的所有元素都可以用作字典键(即它们都是可散列的),这通常会更快。 Python编程常见问题

d = {}
for x in mylist:
    d[x] = 1
mylist = list(d.keys())



Related



Tags

python python