【问题标题】:Accessing an item in a Python dict访问 Python 字典中的项目
【发布时间】:2020-03-16 16:24:59
【问题描述】:

假设我有一个像这样过滤掉数据的函数:

from typing import Dict, Union


def filterData(data: Dict[str, str], fields: Union[list, tuple]) -> dict:

    filteredData = {}

    for field in fields:
        if field in data:
            filteredData[field] = data[field]

    return filteredData

我是这样使用这个函数的:

data = filterData({"a": "b", "c": "d"}, ("a")) # This should return {"a": "b"}.

现在,当我尝试访问像 data.a 这样的 a 属性时,我收到一条错误消息,上面写着 Instance of dict has no member a。如何定义和应用定义该字典所有成员的类型?

我尝试创建一个类,

class ReqData():
    a: str

然后像这样应用于变量,

data: ReqData = filterData({"a": "b", "c": "d"}, ("a")

但这也没有用。

【问题讨论】:

标签: python python-3.x dictionary


【解决方案1】:

这与类型注释无关,与 Python 字典语法无关。与 JavaScript 对象不同,您不能使用点符号来访问 Python 字典中的键。相反,您必须像在当前代码中一样使用括号表示法:

print(data["a"])

顺便说一句,您可以将filterData() 函数用字典理解写在一行中:

def filterData(data: Dict[str, Union(str, int)], fields: Union[list, tuple]) -> dict:
    return {field : data[field] for field in data if field in fields}

【讨论】:

  • 哎呀菜鸟错误。谢谢!
  • @Sanjay 没问题。如果您有兴趣,我刚刚为您的 filterData() 函数添加了一个 oneliner 实现。请注意,我首先遍历 data 中的键。这在fields 包含不在data 中的额外键的情况下更有效。
  • 谢谢。但我认为存在语法错误。我猜应该删除field in fields]} 的方括号。
  • @Sanjay 是的,你是对的。感谢您注意到这一点。现在已经修复了。
【解决方案2】:

定义过滤器数据(dd,过滤器): return { k: v for k, v in dd if k in filters}

print(filter_data({'a': 'avalue', 'b': 'bvalue', 'c': 'cvalue'}, ['a', 'c']))

{'a': 'avalue', 'c': 'cvalue'}

【讨论】:

  • 感谢您为 Stack Overflow 做出贡献。虽然这提供了filter_data() 的更简单实现,但它仍然没有回答 OP 关于如何从返回的字典中访问单个项目的问题。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多