从列表中删除一个已经存在的元素,并在列表中仅保留该值的一个元素

时间:2019-11-18 17:28:25

标签: python list sorting

我有一个列表,如果有两个具有相同值的元素,我只想保留一个

l = [1,2,3,2,2]

,我希望输出为:

[1,2,3]

我该怎么做?

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+中的字典保留元素的顺序)

  

https://stackoverflow.com/a/39980744/8692977

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