Python 确保dict列表中的每个键都有一个带键的dict
背景: 我使用Ajax调用从python模块返回一些复杂的JSON。我必须使用一个键列表,并确认一个单项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中。因为列表是动态的,所以简单地检查“那些”是不
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,我在回答中使用了Py3repr
来表示set
,但是你会看到它在Py2中是等效的非文字语法。实际上,您不需要显式地迭代缺少的结果missing=list(missing)
将set
转换为list
,或missing=sorted(missing)
以获得排序的列表。到目前为止,这非常好。我得到:set(['thats']),我可以迭代它来填充一个“缺少的键”列表。@JacobIRR:Ah,我在回答中使用了Py3repr
来表示set
,但是你会看到它在Py2中是等效的非文字语法。实际上,您不需要显式地迭代缺少的结果missing=list(missing)
将set
转换为list
,或missing=sorted(missing)
以获取