15

我有三个列表:

del_ids = [2, 4]
ids = [3, 2, 4, 1]
other = ['a', 'b', 'c', 'd']

我的目标是删除del_ids结果是

ids = [3, 1]
other = ['a', 'd']

我试图为要保留的元素做一个掩码 ( mask = [id not in del_ids for id in ids]),我计划在两个列表上都应用这个掩码。

但我觉得这不是一个pythonic的解决方案。你能告诉我怎样才能做得更好吗?

4

4 回答 4

19

再次压缩、过滤和解压缩:

ids, other = zip(*((id, other) for id, other in zip(ids, other) if id not in del_ids))

zip()调用将每个与相应的元素配对,id生成other器表达式过滤掉id中列出的任何对del_idszip(*..)然后将剩余的对再次梳理成单独的列表。

演示:

>>> del_ids = [2, 4]
>>> ids = [3, 2, 4, 1]
>>> other = ['a', 'b', 'c', 'd']
>>> zip(*((id, other) for id, other in zip(ids, other) if id not in del_ids))
[(3, 1), ('a', 'd')]
于 2013-08-01T13:24:26.973 回答
2

压缩、过滤、解压缩:

ids, other = zip(*filter(lambda (id,_): not id in del_ids, zip(ids, other)))
于 2013-08-01T13:30:00.043 回答
2

为了避免学习棘手的语法,请分两步完成。

other = [o for my_id, o in zip(ids, other) if my_id not in del_ids]
ids = [my_id for my_id in ids if my_id not in del_ids]

缺点
您必须以正确的顺序执行语句,因此如果由于某种原因顺序更改,则存在错误的风险。

优点
很直接,所以下次你想做的时候不用再去搜索 Stackoverflow 了。

于 2021-05-03T12:31:51.297 回答
1

转换为 pandas 数据框并应用掩码:

del_ids = [2, 4]
ids = [3, 2, 4, 1]
other = ['a', 'b', 'c', 'd']
df = pd.DataFrame({'ids':ids,'other':other})
df = df[~df.ids.isin(del_ids)]
ids = df['ids'].tolist()
other = df['other'].tolist()
于 2021-02-23T06:26:20.370 回答