【问题标题】:Ensure list of dicts has a dict with key for each key in list确保字典列表有一个字典,其中包含列表中每个键的键
【发布时间】:2016-09-01 01:05:29
【问题描述】:

上下文: 我正在使用 Ajax 调用从 python 模块返回一些复杂的 JSON。我必须使用键列表并确认单项字典列表包含每个键的字典。

例子:

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

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

我怎么知道 mydictlist 缺少“那些”键?一旦知道这一点,我就可以将 {'those':4} 附加到 mylist。简单地检查“那些”是行不通的,因为列表是动态的。数据结构不能改变。

谢谢。

【问题讨论】:

  • 你是说不能简单地检查每个列表项是in字典吗?
  • 对,因为不同情况下列表会变化
  • @wwii:不止一个dict;天真的方法需要为mylist 中的每个值迭代一次mydictlist,即O(n*m)(其中nm 是两个lists 的长度),包括最坏情况和预期情况。更好的解决方案可以将工作减少到O(n + m),如果lists 很大,这可能会有所作为。
  • mylist 有可能重复吗?
  • @wwii 不,它总会有独特的物品

标签: python


【解决方案1】:

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

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

这会让你得到missing{'those'}

由于命名的set 方法可以接受多个参数(它们本身不需要是sets),您可以将所有dicts 作为参数解压缩到difference 以从您的set 一次所需的键。

如果您确实需要处理重复项(以确保您在mylist 中看到每个keys 至少在mydictlist 的键中多次出现,那么mylist 可能包含两次必须在dicts 中出现两次),您可以使用collectionsitertools 获取剩余计数:

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()

【讨论】:

  • 到目前为止这很棒。我得到:set(['those']),我可以对其进行迭代以填充“缺失键”列表。
  • @JacobIRR:啊,我在回答中使用 Py3 repr 代替 set,但您会认为它是 Py2 中等效的非文字语法。您实际上不需要明确地迭代 missing 结果; missing = list(missing)set 转换为list,或missing = sorted(missing) 得到排序后的list
【解决方案2】:

最直接的方法是遍历两个容器并检查:

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)

【讨论】:

  • 为什么将其限制为每个 dict 的单个键?我的意思是,当然,示例代码中每个 dict 都有一个键,但实际上将它们全部吞掉会更容易。
  • True dat, '特别是因为我不在乎第一个例子。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2022-09-23
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多