如何使列表只包含Python中的不同元素?

Ale*_*lex 109 python

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

Mar*_*ers 230

最简单的是转换为集合然后返回到列表:

my_list = list(set(my_list))
Run Code Online (Sandbox Code Playgroud)

这样做的一个缺点是它不会保留订单.您可能还想考虑一个集合是否是首先使用的更好的数据结构,而不是列表.

  • 不,他们不是. (5认同)
  • @Ant字典的键顺序是从Python 3.6中保留的,但是它说:“此新实现的顺序保留方面被视为实现细节,不应依赖于此”。由于它们都是基于散列的,因此我认为集合是相同的,但是没有提到,因此显然不是:https://docs.python.org/3.6/whatsnew/3.6.html (2认同)

Paw*_*żak 26

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)]
Run Code Online (Sandbox Code Playgroud)

好的,现在它是如何工作的,因为这里有点棘手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
Run Code Online (Sandbox Code Playgroud)

为什么它会返回True?print(和set.add)什么都不返回:

In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)

而且not None == True,但是:

In [2]: 1 not in [1,2,3] and not print('add')
Out[2]: False
Run Code Online (Sandbox Code Playgroud)

为什么在[1]中打印'add'而在[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
Run Code Online (Sandbox Code Playgroud)

没有订单(它更快):

def f(seq): # Not order preserving
  return list(set(seq))
Run Code Online (Sandbox Code Playgroud)


bri*_*out 20

单行并保留订单

list(OrderedDict.fromkeys([2,1,1,3]))
Run Code Online (Sandbox Code Playgroud)

虽然你需要

from collections import OrderedDict
Run Code Online (Sandbox Code Playgroud)

  • 另一种形式是:OrderedDict.fromkeys(my_list).keys() (2认同)
  • @DannyStaple:它在 python 2 中工作,但在 python 3 中它返回字典键的视图,这对于某些目的可能没问题,但例如不支持索引。 (2认同)

kha*_*hik 10

保留订单:

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

  • 在 python 3.4 中返回一个空列表!!! (2认同)

dis*_*ame 10

让我通过一个例子向你解释一下:

如果你有Python列表

>>> randomList = ["a","f", "b", "c", "d", "a", "c", "e", "d", "f", "e"]
Run Code Online (Sandbox Code Playgroud)

并且您想要从中删除重复项.

>>> uniqueList = []

>>> for letter in randomList:
    if letter not in uniqueList:
        uniqueList.append(letter)

>>> uniqueList
['a', 'f', 'b', 'c', 'd', 'e']
Run Code Online (Sandbox Code Playgroud)

这是您从列表中删除重复项的方法.

  • +1,因为它是唯一适用于不可散列的类型,但确实有 __eq__ 函数(如果您的类型是可散列的,请使用其他解决方案之一)。请注意,对于非常大的列表,它会很慢。 (4认同)

cod*_*k3y 8

如何解释内涵

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

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

编辑 @Danny 的评论:我最初的建议没有按顺序排列钥匙。如果您需要对键进行排序,请尝试:

>>> from collections import OrderedDict

>>> OrderedDict( (x,1) for x in mylist ).keys()
[3, 2, 1, 4, 5]
Run Code Online (Sandbox Code Playgroud)

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