【问题标题】:keep values from dictionary that are not in list保留字典中不在列表中的值
【发布时间】:2019-09-11 19:33:32
【问题描述】:

我有一个列表val

val = ['ed2', 'll', 'mal', 'DC', 'sp3', 'oo']

还有一本字典d

d = {'A': ['2500ed2', '545ll', 'fine', '340DC'], 'B': ['Q5mal', 'fern','2DC', '2mal', 'fist', 'Q12mal']}

我想跳过以 val 中包含的任何值结尾的任何字符串,例如2500ed2 将被跳过,因为它以 ed2 结尾,但 fine 将保留在最终字典中,因为它不会以 val 中的任何值结尾。我希望我的最终输出是

d = {'A': ['fine'],'B': ['fern','fist']}

我尝试了以下方法,但这并不完全奏效

d = {}
for k, v in d.items():
    d[k] = [n for n in v if n not in val]

如何更改循环以获得所需的输出?

【问题讨论】:

    标签: python-3.x list loops dictionary


    【解决方案1】:

    你可以使用endswith():

    d = { k:[ev for ev in v if not any(ev.endswith(x) for x in val)]
          for k,v in d.items() }
    

    【讨论】:

      【解决方案2】:

      您可以使用endswith() 进行列表理解:

      result = {}
      for key, value in d.items():
          result[key] = [s for s in value if not any(s.endswith(v) for v in val)]
      

      根据@ShadowRanger,您可以通过在进入循环之前将val 转换为元组来改进这一点。这意味着您不需要生成器或列表解析来迭代 val,因为 endswith() 可以将元组作为其参数:

      result = {}
      val = tuple(val)
      for key, value in d.items():
          result[key] = [s for s in value if not s.endswith(val)]
      

      【讨论】:

      • 您不需要在 any 中明确列出。使用生成器效率更高。
      • 甚至更好:将val 转换为tuple(在循环之外以提高性能),例如val = tuple(val),你可以做if not s.endswith(val); endswith 可以接受 tuple 的结尾来检查,并且与 any(s.endswith(v) for v in val) 的工作相同,但效率更高(无需创建 Python 生成器,调用 any,多次调用 endswith 等) .
      • @ShadowRanger 哇,我不知道endswith() 可以接受一个元组作为它的论点,谢谢你的建议!更新了我的答案。
      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2022-11-24
      • 2019-12-31
      • 2021-08-09
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多