我有一个列表,如果有两个具有相同值的元素,我只想保留一个
l = [1,2,3,2,2]
,我希望输出为:
[1,2,3]
我该怎么做?
答案 0 :(得分:1)
如果要保持元素顺序,可以采用这种方法
result = []
l = [1,2,3,2,2]
for e in l:
if e not in result:
result.append(e)
print(result)
# Result: [1, 2, 3]
如果订单不重要,则可以按照前面提到的方法在一行中完成
list(set(l))
另一种将保持元素顺序的单行解决方案是(请注意python 3.6+中的字典保留元素的顺序)
list({s:None for s in l}.keys())
答案 1 :(得分:0)
您可以使用set()
和list()
:
list(set([1,2,3,2,2]))
# Output: [1, 2, 3]
set()
删除所有重复项,而不必保留顺序。list()
将集合{1, 2, 3}
转换回列表由于字典是在更高版本的Python中订购的,因此:
list(dict.fromkeys([1,2,3,2,2]).keys())
# Output: [1, 2, 3]
将保留Python 3.7+上的顺序,与set()
不同。
注意:
dict.fromkeys([1,2,3,2,2])
# Output: {1: None, 2: None, 3: None}
我们使用列表项作为键生成(顺序敏感)字典。
字典键(如集合)被散列且如此独特-列表中的所有重复都被丢弃
答案 2 :(得分:0)
如果要按相同顺序保留原始列表中的项目,请使用itertools
documentation中的unique_everseen
配方:
def unique_everseen(iterable, key=None):
"List unique elements, preserving order. Remember all elements ever seen."
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
# unique_everseen('ABBCcAD', str.lower) --> A B C D
seen = set()
seen_add = seen.add
if key is None:
for element in filterfalse(seen.__contains__, iterable):
seen_add(element)
yield element
else:
for element in iterable:
k = key(element)
if k not in seen:
seen_add(k)
用法:
print(list(unique_everseen(l)))