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

如何使列表在Python中只包含不同的元素?,python,Python,我在Python中有一个列表,如何使其值唯一?最简单的方法是将其转换为集合,然后再转换回列表: my_list = list(set(my_list)) 这样做的一个缺点是它不能维持秩序。你也可以考虑一个集合是否是一个更好的数据结构,而不是一个列表。< P>: 为维持秩序: 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中有一个列表,如何使其值唯一?

最简单的方法是将其转换为集合,然后再转换回列表:

my_list = list(set(my_list))
这样做的一个缺点是它不能维持秩序。你也可以考虑一个集合是否是一个更好的数据结构,而不是一个列表。

< P>:

为维持秩序:

l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]
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)]

如果列表中的所有元素都可以用作字典键(即,它们都可以散列),这通常会更快

的修改版本

为维持秩序:

l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]
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)]
好的,现在它是如何工作的,因为如果x不在seen和not seen中,这里有点棘手。添加(x):

为什么它会变成真的?print(和set.add)不返回任何内容:

In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>
为什么在[1]中打印“add”,而在[2]中不打印?请参阅
False和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
没有秩序(速度更快):


在保留顺序的同时删除重复项的最简单方法是使用(Python 2.7+)


词典理解如何

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

>>> {x:1 for x in mylist}.keys()
[1, 2, 3, 4, 5]
编辑 对于@Danny的评论:我最初的建议并没有让钥匙保持有序。如果需要对键进行排序,请尝试:

>>> from collections import OrderedDict

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

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

list(OrderedDict.fromkeys([2,1,1,3]))
尽管你需要

from collections import OrderedDict

让我举一个例子向你解释:

如果你有Python列表

>>> randomList = ["a","f", "b", "c", "d", "a", "c", "e", "d", "f", "e"]
并且您希望从中删除重复项

>>> uniqueList = []

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

>>> uniqueList
['a', 'f', 'b', 'c', 'd', 'e']

这就是从列表中删除重复项的方法。

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'])


或者,如果您想保留排序,请确定问题的标题。你不是在说让清单变得清晰。你说的是要使列表项与众不同。为什么你首先需要列表?也许set()或dict()就足够了。有关更多信息,请参阅可能重复的或我错了的或使用python3k时,值将被保留,因为set现在已排序?@Ant Dictionary键顺序在Python 3.6中保留,但它说“这个新实现的顺序保持方面被认为是一个实现细节,不应该依赖。”因为它们都基于散列,我认为集合应该是相同的,但没有提到,所以显然没有:保留顺序和函数方式:在
[23]:从functools导入reduce
在[24]:reduce中(lambda acc,elem:acc+[elem]如果不是acc else acc中的elem,[2,1,2,3,3,3,3,4,5],)
Out[24]:[2,1,3,4,5]
对seen而不是dict使用set有意义吗?在Python中,set和dict是使用哈希表构建的,因此在这个场景中它们是可互换的。它们都提供相同的操作(限制重复)并且两者都有相同的运行时间。这一个比较慢,生成器版本要快得多。内部帮助函数的排序(代码中有一个bug,应该是_f而不是_f10,谢谢你的发现)+1,因为它是唯一一个适用于不可破坏的类型,但确实有一个eq函数(如果您的类型是可散列的,请使用其他解决方案之一)。请注意,对于非常大的列表,这将非常缓慢。除非在克劳德解释的某些特殊情况下,否则此类型的性能最差:O(n^2)这不会保留顺序-字典顺序(和设置顺序)由哈希算法而不是插入顺序决定。但我不确定OrderedDict类型的词典理解效果。@DannyStaple True。如果需要有序输出,我使用
OrderedDict
和生成器添加了一个示例。另一种形式是:OrderedDict.fromkeys(my_list).keys()@DannyStaple:这在python 2中是可行的,但在python 3中它返回字典键的视图,这在某些情况下可能是可行的,但不支持索引。例如,最初的一行可以工作。aternative表单返回一个odict_键类型,它对此不太有用,但仍然可以转换为列表。在python 3.4中,它返回一个n空列表!!!
from collections import OrderedDict
>>> randomList = ["a","f", "b", "c", "d", "a", "c", "e", "d", "f", "e"]
>>> uniqueList = []

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

>>> uniqueList
['a', 'f', 'b', 'c', 'd', 'e']
>>> 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'])