如何删除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中的一个。你的第一个代码解决了我的问题。