我有一个如下所示的列表:
lst = ['p','p','p','p','p','m','m','m','n','n','n','n','d','d']
我想删除每个项目中的一个。目前我的代码如下所示:
for item in lst:
if (lst[-1] == lst[-2]) == True:
del(lst[-2])
即如果列表的最后两项与第二项相同 从最后一个应删除,但我的代码不起作用。
答案 0 :(得分:2)
您可以制作set
个唯一字符,遍历列表的副本,然后在添加到输出列表时从集合中删除项目:
lst = ['p','p','p','p','p','m','m','m','n','n','n','n','d','d']
chars_to_remove = set(lst)
counter = len(chars_to_remove)
output = []
for item in lst[:]:
if item in chars_to_remove:
chars_to_remove.remove(item)
continue
else:
output.append(item)
print(output)
结果:
['p', 'p', 'p', 'p', 'm', 'm', 'n', 'n', 'n', 'd']
注意:您仍需要定义当列表中只有一个字符串实例时会发生什么。 (即它是否也会被删除?)在上面的代码中,它将被删除。但是这可以通过向循环体添加另一个条件来改变:
示例输入:lst = ['p','p','p','p','p','m','m','m','q','n','n','n','n','d','d']
for item in lst[:]:
if lst[:].count(item) == 1:
output.append(item)
continue
elif item in chars_to_remove:
chars_to_remove.remove(item)
continue
else:
output.append(item)
结果:
['p', 'p', 'p', 'p', 'm', 'm', 'q', 'n', 'n', 'n', 'd']
答案 1 :(得分:1)
您还可以使用sum
和groupby
:
from itertools import groupby
lst = ['p', 'p', 'p', 'p', 'p', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'd', 'd']
final = sum((list(g)[:-1] for _, g in groupby(lst)), [])
print(final)
输出:
['p', 'p', 'p', 'p', 'm', 'm', 'n', 'n', 'n', 'd']
答案 2 :(得分:0)
你可以试一试
result = []
for _, u in groupby(lst):
new_u = list(u)
last_index = max(1, len(new_u) - 1)
result += new_u[:last_index]
答案 3 :(得分:0)
目前尚不清楚您的预期结果如何。您的代码将无法正常工作,因为您在变异时迭代列表。相反,迭代副本(lst[:]
)。
for item in lst[:]:
if (lst[-1] == lst[-2]):
del(lst[-2])
lst
# ['p', 'p', 'p', 'p', 'p', 'm', 'm', 'm', 'n', 'n', 'n', 'n', 'd']
但是,您的代码仍需要更多解决方法:
我想删除每个项目中的一个
请改为尝试:
import itertools as it
lst = ['p','p','p','p','p','m','m','m','n','n','n','n','d','d']
list(it.chain.from_iterable((list(g)[:-1] for _, g in it.groupby(lst))))
# ['p', 'p', 'p', 'p', 'm', 'm', 'n', 'n', 'n', 'd']
答案 4 :(得分:-1)
假设您要删除列表中的单个匹配项,可以在一行中完成:
[lst.remove(c) for c in set(lst)]
这不会返回答案,但会修改您的列表,因此现在会修剪lst
。
或者包含在一个可能更有用的功能中:
def remove_first_occurence(lst):
l = lst.copy()
[l.remove(c) for c in set(l)]
return l