删除列表的第一个重复元素

时间:2019-01-03 02:45:55

标签: python list

我需要在保留输入列表顺序的同时,删除列表中第一个元素重复出现(重复出现(多次))。例如:输入     in = [2、3、4、5、3、6、4、1] 输出应该是     out = [2、3、4、5、6、4、1]

我在下面进行了尝试,并给出了正确的结果,我只是想向社区咨询是否有更好或更完善的pythonic解决方案

input = [2, 3, 4, 5, 3, 6, 4, 1]
first_dupe = None
for elem in input:
    if input.count(elem) > 1:
        first_dupe = elem
        break

flg = True
new_list = []
for x in input:
    if x != first_dupe or flg is True:
        new_list.append(x)
        if x == first_dupe:
             flg = False

print(new_list)

3 个答案:

答案 0 :(得分:2)

如果只想删除第一个重复项,则可以创建集合,并将元素追加到新列表(如果它们在集合中),同时也从集合中删除每个元素。如果看不到元素,请追加列表的其余部分。

如果重复出现的时间很早,这是相当有效的,但是如果发现迟到的元素则为O(1)

x = [2, 3, 4, 5, 3, 6, 4, 1]
s = set(x)
out = []

for i,z in enumerate(x):
    if z in s:
        out.append(z)
        s.remove(z)
    else:
        break

out += x[i+1:]

out 
# returns:
[2, 3, 4, 5, 6, 4, 1]

答案 1 :(得分:0)

您可以跟踪已使用的内容,并检查其中是否包含该值。

lst = [2, 3, 4, 5, 3, 6, 4, 1]

used = set([])
for i, x in enumerate(lst):
    if x in used:
        lst.pop(i)
        break
    used.add(x)
print(lst)

此外,请勿提供与python中的关键字相同名称的变量或其他名称。 input已经是内置函数。

答案 2 :(得分:0)

这是我的Chiheb Nexus版本的答案。

def find_dup(lst):
     seen = set()
     it = iter(lst)
     for item in it:
         if item not in seen:
             seen.add(item)
             yield item
         else:
             yield from it

lst = [2, 3, 4, 5, 3, 6, 4, 1]
list(find_dup(lst))

[2, 3, 4, 5, 6, 4, 1]