如何使清单不同?

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

最简单的是转换成一个集合然后回到列表:

my_list = list(set(my_list)) 

这样做的一个缺点就是不能保存顺序。 你也可能想要考虑一个集合是否是一个更好的数据结构来使用,而不是一个列表。

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

单线和维护秩序

 list(OrderedDict.fromkeys([2,1,1,3])) 

尽pipe你需要

 from collections import OrderedDict 

要保存顺序:

 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列表

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

这是如何从列表中删除重复项。

字典理解如何?

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

编辑到@丹尼的评论:我原来的build议不保持订购的钥匙。 如果您需要sorting键,请尝试:

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

它通过元素的第一次出现保持元素的顺序(没有被广泛地testing)

http://www.peterbe.com/plog/uniqifiers-benchmark

 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 

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

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

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

 from collections import OrderedDict d = OrderedDict() for x in mylist: d[x] = True print d.iterkeys() 

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