Python 确保dict列表中的每个键都有一个带键的dict

Python 确保dict列表中的每个键都有一个带键的dict,python,Python,背景: 我使用Ajax调用从python模块返回一些复杂的JSON。我必须使用一个键列表,并确认一个单项dict列表包含一个带有每个键的dict 例如: mylist=['this', 'that', 'these', 'those'] mydictlist=[{'this':1},{'that':2},{'these':3}] 我如何知道mydictlist缺少“那些”键?一旦我知道了这一点,我就可以将{'thats':4}附加到mylist中。因为列表是动态的,所以简单地检查“那些”是不

背景: 我使用Ajax调用从python模块返回一些复杂的JSON。我必须使用一个键列表,并确认一个单项dict列表包含一个带有每个键的dict

例如:

mylist=['this', 'that', 'these', 'those']

mydictlist=[{'this':1},{'that':2},{'these':3}]
我如何知道mydictlist缺少“那些”键?一旦我知道了这一点,我就可以将{'thats':4}附加到mylist中。因为列表是动态的,所以简单地检查“那些”是不起作用的。数据结构无法更改


谢谢。

最简单的方法是迭代两个容器并检查:

for key in mylist:
    if not any(key in dic for dic in mydictlist):
        print key, "missing"
但是,如果您有很多键和/或字典,这将不会有效率:它会对
mylist
中的每个元素在
mydictlist
上迭代一次,即O(n*m)。相反,考虑一个集合操作:

print set(mylist).difference(*mydictlist)

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

for key in mylist:
    if not any(key in dic for dic in mydictlist):
        print key, "missing"
但是,如果您有很多键和/或字典,这将不会有效率:它会对
mylist
中的每个元素在
mydictlist
上迭代一次,即O(n*m)。相反,考虑一个集合操作:

print set(mylist).difference(*mydictlist)

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

missing = set(mylist).difference(*mydictlist)
这会使您丢失
{'this'}
中的
missing

由于命名的
set
方法可以接受多个参数(它们本身不需要是
set
s),因此您可以将所有
dict
s解包为
difference
的参数,以便一次从所需键的
set
中减去所有参数

如果您确实需要处理重复项(以确保在
mylist
的键中至少多次看到
mydictlist
中的每个
键,因此
mylist
可能包含一个值,该值必须在
dict
中出现两次),您可以使用
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()

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

missing = set(mylist).difference(*mydictlist)
这会使您丢失
{'this'}
中的
missing

由于命名的
set
方法可以接受多个参数(它们本身不需要是
set
s),因此您可以将所有
dict
s解包为
difference
的参数,以便一次从所需键的
set
中减去所有参数

如果您确实需要处理重复项(以确保在
mylist
的键中至少多次看到
mydictlist
中的每个
键,因此
mylist
可能包含一个值,该值必须在
dict
中出现两次),您可以使用
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()

熊猫包是处理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

熊猫包是处理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


你是说你不能简单地检查每个列表项是字典吗?对,因为列表在不同的时间变化cases@wwii:多个
dict
;简单的方法需要对
mylist
中的每个值迭代一次
mydictlist
,即
O(n*m)
(其中
n
m
是两个
列表的长度),这两种情况都是最坏和预期的。更好的解决方案可以将工作减少到
O(n+m)
,如果
列表很大,这可能会有所不同。
mylist
是否可能有重复项?@wwii不,它总是有唯一项。你是说你不能简单地检查每个列表项是否都是字典吗?对,因为列表会以不同的方式更改cases@wwii:多个
dict
;简单的方法需要对
mylist
中的每个值迭代一次
mydictlist
,即
O(n*m)
(其中
n
m
是两个
列表的长度),这两种情况都是最坏和预期的。更好的解决方案可以将工作减少到
O(n+m)
,如果
列表很大,这可能会有所不同。
mylist
是否可能有重复项?@wwii否,它将始终具有唯一项为什么将其限制为每个
dict
中的单个键?我的意思是,当然,示例代码中每个
dict
都有一个键,但实际上更容易将它们全部读出。True dat,'特别是因为我不关心第一个示例。为什么将它限制为每个
dict
中的一个键?我的意思是,当然,示例代码每个
dict
都有一个键,但实际上更容易把它们全部念出来。True dat,'特别是因为我不在乎第一个示例。到目前为止,这很好。我得到:set(['thats']),我可以迭代它来填充一个“缺少的键”列表。@JacobIRR:Ah,我在回答中使用了Py3
repr
来表示
set
,但是你会看到它在Py2中是等效的非文字语法。实际上,您不需要显式地迭代
缺少的
结果
missing=list(missing)
set
转换为
list
,或
missing=sorted(missing)
以获得排序的
列表。到目前为止,这非常好。我得到:set(['thats']),我可以迭代它来填充一个“缺少的键”列表。@JacobIRR:Ah,我在回答中使用了Py3
repr
来表示
set
,但是你会看到它在Py2中是等效的非文字语法。实际上,您不需要显式地迭代
缺少的
结果
missing=list(missing)
set
转换为
list
,或
missing=sorted(missing)
以获取