1

我正在尝试使用另一个列表过滤掉一个列表。但是,我用来过滤另一个列表的列表元素不是相同的字符串。请看我的例子,因为它会更有意义:

mylist = ['14001IB_L1P0', '14001OB_L1P1', '14002IB_L3P0', '14003OB_L1P1', '14001OB_L2P0']
remove_list = ['14001', '14002']

我想从 mylist 中删除以 remove_list 中的值开头的值。我试过这样做:

filtered_mylist = mylist[:]

for x in remove_list:
    for i in filtered_mylist:
        if x in i:
            print('remove ' +i)
            filtered_mylist.remove(i)
        else:
            print('keep '+i)

然而,结果如下:

remove 14001IB_L1P0
keep 14002IB_L3P0
keep 14003OB_L1P1
remove 14001OB_L2P0
keep 14001OB_L1P1
remove 14002IB_L3P0

这就是filtered_mylist的组成:

['14001OB_L1P1', '14003OB_L1P1']

但是,它应该只包含 1 个元素: ['14003OB_L1P1']

在我看来,由于某种原因,循环跳过了第一个循环中的第二个元素“14001OB_L1P1”。为什么会这样?

4

4 回答 4

1

这是一个班轮

mylist = list(filter(lambda x: all([x.find(y) != 0 for y in remove_list]), mylist))

#Output
['14003OB_L1P1']

当且all([x.find(y) != 0 for y in remove_list])Truex不以remove_list.

all()意味着一切都必须是Truex.find(y) != 0表示x不以 . 开头y

其余的只是执行过滤器。

于 2020-05-19T07:41:48.240 回答
1

希望这段代码对您有所帮助。

mylist = ['14001IB_L1P0', '14001OB_L1P1', '14002IB_L3P0', '14003OB_L1P1', '14001OB_L2P0']
remove_list = ['14001', '14002']

filtered_mylist = mylist[:]

for x in remove_list:

    i = 0
    while i < len(filtered_mylist):
        if x in filtered_mylist[i]:
            print('remove ' + filtered_mylist[i])
            filtered_mylist.remove(filtered_mylist[i])
        else:
            print('keep '+ filtered_mylist[i])
            i+=1
于 2020-05-19T07:36:45.487 回答
1

这是另一种方法 - append 方法。

尝试使用“过滤功能+追加”来执行此操作而不是删除。这样安全多了。

mylist = ['14001IB_L1P0', '14001OB_L1P1', '14002IB_L3P0', '14003OB_L1P1', '14001OB_L2P0']
remove_list = ['14001', '14002']


def is_valid(item):
    for pattern in remove_list:
        if item.startswith(pattern):
            return False
    return True


res = []
for item in mylist:
    if is_valid(item):
        res.append(item)
print(res)
于 2020-05-19T07:37:47.073 回答
1

这会有帮助吗?

remove_final = []
keep_final = []
for element in mylist:
    if any([element.startswith(x) for x in remove_list]):
        print(f'remove {element}')
        remove_final.append(element)
    else:
        print(f'keep {element}')
        keep_final.append(element)

输出:

remove 14001IB_L1P0
remove 14001OB_L1P1
remove 14002IB_L3P0
keep 14003OB_L1P1
remove 14001OB_L2P0

最终名单:

keep_final
['14003OB_L1P1']

remove_final
['14001IB_L1P0', '14001OB_L1P1', '14002IB_L3P0', '14001OB_L2P0']
于 2020-05-19T07:35:32.660 回答