如何删除python列表中的每一项中的一项
我有一个如下列表:如何删除python列表中的每一项中的一项,python,list,duplicates,Python,List,Duplicates,我有一个如下列表: 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]) 我想删除每个项目中的一个。当前我的代码如下所示: lst = ['p','p','p','p','p','m','m','m','n','n','n','n','d','d'] for ite
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])
我想删除每个项目中的一个。当前我的代码如下所示:
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])
也就是说,如果列表的最后两项与第二项相同
应该删除最后一个字符,但我的代码不起作用。您可以对唯一字符进行
设置,循环复制列表,然后在添加到输出列表时从集中删除项目:
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']
lst[:]中项目的:
如果lst[:]计数(项目)==1:
output.append(项目)
持续
要删除的字符中的elif项:
要删除的字符。删除(项目)
持续
其他:
输出。追加(项目)
结果:
['p',p','p','m','m','q','n','n','n','d']
您可以创建一个唯一字符的集,循环复制列表的副本,然后在添加到输出列表时从集中删除项目:
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']
lst[:]中项目的:
如果lst[:]计数(项目)==1:
output.append(项目)
持续
要删除的字符中的elif项:
要删除的字符。删除(项目)
持续
其他:
输出。追加(项目)
结果:
['p',p','p','m','m','q','n','n','n','d']
假设您要删除列表中的单个事件,可以在一行中完成:
[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
假设要删除列表中的单个引用,可以在一行中完成:
[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
你可以试试看
result = []
for _, u in groupby(lst):
new_u = list(u)
last_index = max(1, len(new_u) - 1)
result += new_u[:last_index]
你可以试试看
result = []
for _, u in groupby(lst):
new_u = list(u)
last_index = max(1, len(new_u) - 1)
result += new_u[:last_index]
现在还不清楚你的预期结果是什么。您的代码将无法工作,因为您正在对列表进行迭代,同时对其进行变异。相反,在副本上迭代(lst[:]
)
但是,您的代码仍然需要解决以下问题:
我想删除每个项目中的一个
请尝试以下方法:
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']
现在还不清楚你的预期结果是什么。您的代码将无法工作,因为您正在对列表进行迭代,同时对其进行变异。相反,在副本上迭代(lst[:]
)
但是,您的代码仍然需要解决以下问题:
我想删除每个项目中的一个
请尝试以下方法:
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']
您还可以使用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']
您还可以使用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']
如果你只有其中一个怎么办?首先:不要在循环列表时修改列表!你也能有这样的列表吗?lst=['p','p','p','p','p','p','p','p','p','p','m','m','n','n','n','n','n','n','d','p','p','n','m']
?@Elmex80s-如果代码编写正确,这既不会影响性能,也不会影响结果。你能给出一个所需输出的示例吗?如果你只有其中一个输出怎么办?首先:不要在循环列表时修改列表!你也能有这样的列表吗?lst=['p','p','p','p','p','p','p','p','p','p','m','m','n','n','n','n','n','n','d','p','p','n','m']
?@Elmex80s-如果代码编写正确,这既不会影响性能也不会影响结果。您能给出所需输出的示例吗?我不建议在列表理解中使用有副作用的方法/函数,如lst.remove(c)
。JacobIRR的所有答案,Lee和Elmex80解决了我的问题。我的列表中没有一个项目出现。我的意思是每件事至少发生两次。我意识到我在一个不断变化的列表上循环,这是另一个问题。我只想从每件物品上取下一件。非常感谢各位。我不建议在列表理解中使用有副作用的方法/函数,如lst.remove(c)
。JacobIRR、tlee和Elmex80s的所有答案都解决了我的问题。我的列表中没有一个项目出现。我的意思是每件事至少发生两次。我意识到我在一个不断变化的列表上循环,这是另一个问题。我只想从每件物品上取下一件。非常感谢大家。我编写的代码在所有唯一项中添加了一个额外项。所以我只想删除每个独特的项目@JacobIRR中的一个。您的第一个代码解决了我的问题。我编写的代码为所有唯一项添加了一个额外项。所以我只想删除每个独特的项目@JacobIRR中的一个。你的第一个代码解决了我的问题。