【问题标题】:Using list compreshension with a list of dictionaries将列表推导与字典列表一起使用
【发布时间】:2019-03-27 16:50:00
【问题描述】:

我有一个字典列表 (LDICT) 和一个字符串列表 (LS)。我想检查以确保 LS 中的项目不是 LDICT 中任何字典中的键。如果是,我想从 LS 中删除该项目。

我已经找到了一种使用 for 循环来做到这一点的方法,但它很难看,我正在努力理解如何使用列表理解来实现这一点。

使用 for 循环的示例请参见下面的代码:

for item in LDICT:
    for k, v in item.iteritems():
        if k in LS:
            LS.remove(k)

【问题讨论】:

    标签: python list-comprehension list-comparison


    【解决方案1】:

    使用any()检查LS中的每个单词:

    [k for k in LS if not any((k in t) for t in LDICT)]
    

    【讨论】:

    • 好干净的答案,尽管如果 LDICT 包含许多大字典并且 LS 很长,它可能需要很长时间才能运行。如果空间复杂性不是问题,我下面的其他答案通常应该在所涉及的数据结构的大小上按时间线性运行。
    • @InonPeled 你的解决方案与sets 确实是OP 考虑的一个很好的优化。我的意图只是“忠实地”重现 OP 当前方法的行为。
    【解决方案2】:

    创建LDICT 的所有字典中的所有键的组合集,并从LS 的集合中减去它:

    (远方)

    LDICT = [ {i:"" for i in range(k,k+20,3)} for k in range(0,100,20)]
    
    LS = [x for x in range(100) if x%4 == 0]
    print(LDICT)
    print(LS)
    
    all_keys = set(x for d in LDICT for x in d)
    print(all_keys)
    
    cleaned_keys = set(LS)-all_keys
    print(cleaned_keys)
    

    输出:

    # LDICT
    [{0: '', 3: '', 6: '', 9: '', 12: '', 15: '', 18: ''}, 
     {20: '', 23: '', 26: '', 29: '', 32: '', 35: '', 38: ''}, 
     {40: '', 43: '', 46: '', 49: '', 52: '', 55: '', 58: ''}, 
     {60: '', 63: '', 66: '', 69: '', 72: '', 75: '', 78: ''}, 
     {80: '', 83: '', 86: '', 89: '', 92: '', 95: '', 98: ''}]
    
     # LS
    [0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 
     68, 72, 76, 80, 84, 88, 92, 96]
    
     # all_keys
     {0, 3, 6, 9, 12, 15, 18, 20, 23, 26, 29, 32, 35, 38, 40, 43, 46, 49, 52, 55, 58, 60,
      63, 66, 69, 72, 75, 78, 80, 83, 86, 89, 92, 95, 98}
    
     # cleaned_keys
     {64, 96, 4, 36, 68, 8, 44, 76, 16, 48, 84, 24, 56, 88, 28}
    

    您只需要从cleaned_keys 中列出一个列表。

    独库:

    【讨论】:

      【解决方案3】:
      forbidden_keys = set(key for dct in LDICT for key in dct)
      filtered_list = [item for item in LST if item not in forbidden_keys]
      

      【讨论】:

      • 这将引发 NameError。认为你的意思是forbidden_keys = set(key for dct in LDICT for key in dct)
      • 是的,我在没有检查的情况下写道,理解表达式中的双 for 循环有时会让我感到困惑。感谢您的关注。
      猜你喜欢
      • 1970-01-01
      • 2021-05-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多