将 Python 列表转换为有序的唯一值
convert Python list to ordered unique values
我遇到很多任务需要过滤 python (2.7) 列表以仅保留有序的唯一值。我通常的方法是使用集合中的 odereddict
:
from collections import OrderedDict
ls = [1,2,3,4,1,23,4,12,3,41]
ls = OrderedDict(zip(ls,['']*len(ls))).keys()
print ls
输出是:
[1, 2, 3, 4, 23, 12, 41]
在 Python 中还有其他最先进的方法吗?
- 注意 - 输入和输出应为
list
edit - 可以在此处找到方法的比较:
https://www.peterbe.com/plog/uniqifiers-benchmark
同时最好的解决方案是:
def get_unique(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
如果您需要保留顺序 和 去除重复项,您可以这样做:
ls = [1, 2, 3, 4, 1, 23, 4, 12, 3, 41]
lookup = set() # a temporary lookup set
ls = [x for x in ls if x not in lookup and lookup.add(x) is None]
# [1, 2, 3, 4, 23, 12, 41]
这应该比您的方法快得多。
您可以像这样使用 set:
newls = []
seen = set()
for elem in ls:
if not elem in seen:
newls.append(elem)
seen.add(elem)
为此定义一个函数:
def uniques(l):
retl = []
for x in l:
if x not in retl:
retl.append(x)
return retl
ls = [1,2,3,4,1,23,4,12,3,41]
uniques(ls)
[1, 2, 3, 4, 23, 12, 41]
另一个解决方案是像这样使用列表理解:
[x for i, x in enumerate(ls) if x not in ls[:i]]
输出:
[1, 2, 3, 4, 23, 12, 41]
我遇到很多任务需要过滤 python (2.7) 列表以仅保留有序的唯一值。我通常的方法是使用集合中的 odereddict
:
from collections import OrderedDict
ls = [1,2,3,4,1,23,4,12,3,41]
ls = OrderedDict(zip(ls,['']*len(ls))).keys()
print ls
输出是:
[1, 2, 3, 4, 23, 12, 41]
在 Python 中还有其他最先进的方法吗?
- 注意 - 输入和输出应为
list
edit - 可以在此处找到方法的比较: https://www.peterbe.com/plog/uniqifiers-benchmark
同时最好的解决方案是:
def get_unique(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
如果您需要保留顺序 和 去除重复项,您可以这样做:
ls = [1, 2, 3, 4, 1, 23, 4, 12, 3, 41]
lookup = set() # a temporary lookup set
ls = [x for x in ls if x not in lookup and lookup.add(x) is None]
# [1, 2, 3, 4, 23, 12, 41]
这应该比您的方法快得多。
您可以像这样使用 set:
newls = []
seen = set()
for elem in ls:
if not elem in seen:
newls.append(elem)
seen.add(elem)
为此定义一个函数:
def uniques(l):
retl = []
for x in l:
if x not in retl:
retl.append(x)
return retl
ls = [1,2,3,4,1,23,4,12,3,41]
uniques(ls)
[1, 2, 3, 4, 23, 12, 41]
另一个解决方案是像这样使用列表理解:
[x for i, x in enumerate(ls) if x not in ls[:i]]
输出:
[1, 2, 3, 4, 23, 12, 41]