【问题标题】:Get the types of the keys in a dictionary获取字典中键的类型
【发布时间】:2017-12-15 17:14:51
【问题描述】:

有没有一种“干净”的方式来获取python3中字典键的类型?

例如,我想确定其中一个字典是否具有str 类型的键:

d1 = { 1:'one', 2:'two', 5:'five' }
d2 = { '1':'one', '2':'two', '5':'five' }

有几种方法可以实现这一点,例如,使用 some as:

isinstance(list(d2.keys())[0], type('str'))

但这很烦人,因为d2.keys() 是不可索引的,所以你需要将它转换成一个列表,只是为了提取列表中一个元素的值并检查类型。

python3 有 get_key_type(d2) 吗? 如果没有,是否有更好(更简洁)的方法来询问字典的键是否为str 类型?

【问题讨论】:

  • <class 'dict_keys'> 是 d1.keys() 的类型,所以我希望你明白我的意思
  • 请不要将答案添加到问题本身。相反,赞成/接受正确的答案(就像你已经做过的那样)。

标签: python python-3.x dictionary types


【解决方案1】:

如果我理解你的问题是正确的,我知道获取字典中所有键类型的最干净的方法是:

types1 = [type(k) for k in d1.keys()]
types2 = [type(k) for k in d2.keys()]

或者,如果您想拥有所有可以使用的独特类型:

types1 = set(type(k) for k in d1.keys())
types2 = set(type(k) for k in d2.keys())

这样您就会知道是单一类型还是多种类型。 (感谢@Duncan)

这会返回包含在各个字典中找到的键类型的列表:

o/p:

[<class 'int'>, <class 'int'>, <class 'int'>]
[<class 'str'>, <class 'str'>, <class 'str'>]

但是,如果您要询问 d2.keys() 的类型,它是:

<class 'dict_keys'>

希望这对您有所帮助。

【讨论】:

  • 好的,你的回答表明我有一个概念错误。在python中,字典可以混合多种类型的键,所以你可以有d1 = { 1:'one', '2':'two'}并且没有办法检查“键的类型”,而是“键的类型”
  • 哦,现在我明白你的意思了,是的,你的评论是对的,这里有一个 link 可能也有帮助。
  • 可能更好:type1 = set(type(k) for k in d1) 和 d2 相同。然后您可以快速确定是否所有键都是一种类型,或者任何键都是所需的类型。
  • @Duncan 的答案打开了许多不错的代码:“选择字典中键为 type('str') 的条目”{k:d[k] for k in d if type(k) == type('str')}。另一个很好的是:“如何将字典中的所有键转换为类型 str”:{str(k):d[k] for k in d }
【解决方案2】:

如果你想知道你的字典是否只有字符串键,你可以简单地使用:

>>> set(map(type, d1)) == {str}
False

>>> set(map(type, d2)) == {str}
True

set(map(type, ...)) 创建一个集合,其中包含不同类型的字典键:

>>> set(map(type, d2))
{str}
>>> set(map(type, d1))
{int}

{str} 是一个字面量,它创建一个包含str 类型的集合。相等性检查适用于集合,如果集合包含完全相同的项目,则给出True,否则给出False

【讨论】:

    【解决方案3】:

    d1.keys() 返回 &lt;class 'dict_keys'&gt; 类型的对象,它是可迭代的,但你不能像列表一样索引它

    >>> d1 = { 1:'one', 2:'two', 5:'five' }
    >>> d1.keys
    <built-in method keys of dict object at 0x7f59bc897288>
    >>> d1.keys()
    dict_keys([1, 2, 5])
    >>> type(d1.keys())
    <class 'dict_keys'>
    >>> [i for i in d1.keys()]
    [1, 2, 5]
    >>> [i for i in d1.keys() if isinstance(i, int)]
    [1, 2, 5]
    

    也只是重复你说的话

    >>> d1.keys()[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'dict_keys' object does not support indexing
    

    同时检查this

    【讨论】:

    • 你说得对 d1.keys() 是可迭代的,所以我已经纠正了这个问题。但是您不回答如何确定 d1.keys() 的每个值的类型,而不将其转换为列表,然后提取值,然后检查类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多