从列表中删除重复项,不包括开始和结束



是否有更多的python方法从列表中删除所有重复元素,同时保留第一个和最后一个元素?

lst = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
occurence = [i for i, e in enumerate(lst) if e == "foo"]
to_remove = occurence[1:-1]
for i in to_remove:
del lst[i]
print(lst) # ['foo', 'bar', 'foobar', 'barfoo', 'foo']

另一个我更喜欢的方法。

for i, e in enumerate(lst[1:-1]): 
if e == "foo": 
del lst[i+1]

使用切片分配并解包/使用过滤器?

lst = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
lst[1:-1] = filter(lambda x: x != "foo", lst[1:-1])
print(lst)

输出:

['foo', 'bar', 'foobar', 'barfoo', 'foo']

您可以使用Python的set数据结构和切片构造一个满足您需求的新列表,如下所示:

lst = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
new_lst = [lst[0]] + list(set(lst[1:-1])) + [lst[-1]]

尝试如下:

lst = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
first, last = lst[0], lst[-1]
seen = {first, last}
seen_add = seen.add
inner = (s for s in lst[1:-1] if not (s in seen or seen_add(s)))
result = [first, *inner, last]

结果:

['foo', 'bar', 'foobar', 'barfoo', 'foo']

你可以试试:

mylist = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
none_duplicated = list(dict.fromkeys(mylist))
print([mylist[0], *none_duplicated, mylist[-1]])

实际上,你的问题不是要删除重复项,而是要删除列表中第一个项目的出现(假设第一个和最后一个是相同的)。但是如果你想要一个更通用的方法,你将首先尝试得到一个没有重复值的列表,然后添加你的第一个和最后一个。

根据您的示例,有必要删除重复项,查看整个列表,然后添加第一个和最后一个元素:

lst = ["foo", "bar", "foobar", "foo", "barfoo", "foo"]
first, last = lst[0], lst[-1]
data = [first, *set([w for w in lst if w not in [first, last]]), last]
print(data)

输出:

['foo', 'bar', 'barfoo', 'foobar', 'foo']

相关内容

最新更新