我需要在保留输入列表顺序的同时,删除列表中第一个元素重复出现(重复出现(多次))。例如:输入 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)
答案 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]