Mar*_*ers 230
最简单的是转换为集合然后返回到列表:
my_list = list(set(my_list))
Run Code Online (Sandbox Code Playgroud)
这样做的一个缺点是它不会保留订单.您可能还想考虑一个集合是否是首先使用的更好的数据结构,而不是列表.
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)
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)
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)
这是您从列表中删除重复项的方法.
如何解释内涵?
>>> 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)
它按元素第一次出现的顺序保持元素(未经广泛测试)
归档时间: |
|
查看次数: |
168722 次 |
最近记录: |