删除列表中与其他列表中的匹配项对应的每个项目

时间:2019-02-16 04:26:26

标签: python python-3.x

我正在展示许多这样的案例中的两个案例来解释这个问题。每个案例 有两个列表。第一个列表,即nu包含元素ID,该ID必须与第二个列表中的每个元组的第一个元素,即nu_ew匹配。 如果找到匹配项,我想从第二个列表(即nu_ew)中删除每个具有相同ID的元组。

问题是我可以成功从案例2中删除所有想要的元素(元组),但是最后一次出现的元素(元组)即('Na23', 0.0078838)与{ {1}}在情况1中保持不变。

我正在寻找任何获得期望结果的方法。任何建议都将不胜感激。

情况1:

nu

nu=['F19', 'U234', 'U235', 'U238', 'Cl35', 'Cl37', 'Na23']

情况2:

nu_ew = [('Mg24', 0.070385), ('Mg25', 0.0092824), ('Mg26', 0.0106276), ('F19', 0.42348), ('U234', 1.083506277), ('U235', 0.0014516), ('U238', 0.202605), ('Cl35', 0.0454252), ('Cl37', 0.0153641), ('Na23', 0.047303), ('F19', 0.0521210), ('U234', 3.61168759), ('U235', 0.000483890), ('U238', 0.067535), ('F19', 0.0217170), ('Na23', 0.0078838), ('Cl35', 0.0181700), ('Cl37', 0.0061456)]

nu=['F19', 'U234', 'U235', 'U238']

我尝试做:

nu_ew = [('Mg24', 0.068893),   ('Mg25', 0.009085), 
         ('Mg26', 0.0104025),   ('F19', 0.414511), 
         ('U234', 1.060551431), ('U235', 0.0014209), 
         ('U238', 0.198313),    ('Cl35', 0.0444628), 
         ('Cl37', 0.0150386),   ('Na23', 0.046301), 
         ('F19', 0.0510167),    ('U234', 5.65627430), 
         ('U235', 0.00075782),  ('U238', 0.105767), 
         ('F19', 0.034011)]

2 个答案:

答案 0 :(得分:2)

我只在这里使用列表理解: 像

result = [t for t in nu_ew if t[0] not in nu]

对于较大的列表

nu_as_set = set(nu)
result = [t for t in nu_ew if t[0] not in nu_as_set]

答案 1 :(得分:0)

要指出两点。

  1. 在迭代列表时不要删除/添加元素到列表中。而是创建一个包含结果的新列表。这可以通过for循环或列表理解来完成。

  2. 您不必遍历nu,只需使用in。如果nu会更大,请考虑使用集合,因为使用in运算符会花费更少的时间。

因此,以下任何一种都可以用于第二个代码。

  1. 使用for循环。
result = []
for id_wf in nu_ew:
    if id_wf[0] in nu:
        result.append(id_wf)
nu_ew = result
print(nu_ew)
  1. 使用列表理解。
nu_ew = [id_wf in nu_ew if id_wf[0] in nu]

nu中取出一组很简单,只需添加

nu = set(nu)

nu_set = set(nu)

(如果要保留原始列表)

事先。