如何删除python列表中的每个项目之一

时间:2018-01-12 21:22:14

标签: 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])

即如果列表的最后两项与第二项相同 从最后一个应删除,但我的代码不起作用。

5 个答案:

答案 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)

您还可以使用sumgroupby

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