代码之家  ›  专栏  ›  技术社区  ›  JacobIRR

确保dicts列表有一个dict,该dict为列表中的每个键都指定了键

  •  0
  • JacobIRR  · 技术社区  · 8 年前

    上下文: 我使用Ajax调用从python模块返回一些复杂的JSON。我必须使用一个键列表,并确认一个单条dict列表包含一个dict和每个键。

    例子:

    mylist=['this', 'that', 'these', 'those']
    
    mydictlist=[{'this':1},{'that':2},{'these':3}]
    

    我怎么知道我的字典列表缺少“那些”键?一旦我知道了这一点,我就可以在我的列表中添加{“these”:4}。简单地检查“那些”是行不通的,因为列表是动态的。数据结构无法更改。

    谢谢

    3 回复  |  直到 8 年前
        1
  •  2
  •   ShadowRanger    8 年前

    简单的代码是将搜索列表转换为一个集合,然后使用差异确定缺少的内容:

    missing = set(mylist).difference(*mydictlist)
    

    让你高兴的是 missing 属于 {'those'} .

    set 方法可以接受多个参数(它们不需要 设置 他们自己),您只需将所有 dict s作为参数 difference 设置 一次获得所需的键。

    如果您确实需要处理重复项(以确保看到每个 keys 在里面 mylist 至少有那么多次 mydictlist 的钥匙,所以 我的列表 可能包含一个值两次,该值必须在 s) ,您可以使用 collections itertools 获取剩余计数:

    from collections import Counter
    from itertools import chain
    
    c = Counter(mylist)
    c.subtract(chain.from_iterable(mydictlist))
    # In 3.3+, easiest way to remove 0/negative counts
    c = +c
    
    # In pre-3.3 Python, change c = +c to get the same effect slightly less efficiently
    c += Counter()
    
        2
  •  0
  •   kindall    8 年前

    最直接的方法是迭代两个容器并检查:

    for key in mylist:
        if not any(key in dic for dic in mydictlist):
            print key, "missing"
    

    然而,如果您有很多键和/或字典,这将不会有效:它会迭代 mydictlist 中的每个元素一次 mylist ,即O(n*m)。相反,请考虑设置操作:

    print set(mylist).difference(*mydictlist)
    
        3
  •  0
  •   abby sobh    8 年前

    熊猫套餐是处理dicts问题列表的好方法。它获取所有键并使它们成为列标题,具有相似键的值填充同一列。

    看看这个:

    import pandas as pd
    
    mydictlist=[{'this':1},{'that':2},{'these':3}]
    
    # Convert data to a DataFrame
    df = pd.DataFrame(mydictlist)
    
    # List all the column header names and check if any of the key words are missing
    df.columns