从Python中的列表中删除一些重复项

Jac*_*ond 5 python list duplicates

我想删除列表中的一定数量的重复项而不删除所有列表.例如,我有一个列表[1,2,3,4,4,4,4,4],我想要删除4个中的3个,这样我就可以了[1,2,3,4,4].一个天真的方式可能会这样做

def remove_n_duplicates(remove_from, what, how_many):
    for j in range(how_many):
        remove_from.remove(what)
Run Code Online (Sandbox Code Playgroud)

有没有办法在列表中一次删除三个4,但保留另外两个.

mgi*_*son 6

如果您只想n从列表中删除第一次出现的内容,使用生成器很容易:

def remove_n_dupes(remove_from, what, how_many):
    count = 0
    for item in remove_from:
        if item == what and count < how_many:
            count += 1
        else:
            yield item
Run Code Online (Sandbox Code Playgroud)

用法如下:

lst = [1,2,3,4,4,4,4,4]
print list(remove_n_dupes(lst, 4, 3))  # [1, 2, 3, 4, 4]
Run Code Online (Sandbox Code Playgroud)

如果我们使用一些额外的辅助存储,保持指定数量的任何项目的副本同样容易:

from collections import Counter
def keep_n_dupes(remove_from, how_many):
    counts = Counter()
    for item in remove_from:
        counts[item] += 1
        if counts[item] <= how_many:
            yield item
Run Code Online (Sandbox Code Playgroud)

用法类似:

lst = [1,1,1,1,2,3,4,4,4,4,4]
print list(keep_n_dupes(lst, 2))  # [1, 1, 2, 3, 4, 4]
Run Code Online (Sandbox Code Playgroud)

此处输入是您要保留的列表和最大项目数.需要注意的是,这些物品需要可以清洗......