【问题标题】:Return the first key in Dictionary - Python 3返回字典中的第一个键 - Python 3
【发布时间】:2018-01-31 20:17:03
【问题描述】:

我正在尝试使用以下代码打印键和值:

data = {"Key1" : "Value1", "Key2" : "Value2"}
print(data.keys()[1])   
print(data.values()[1])

我得到了错误

'dict_keys' object does not support indexing

上面提到的代码有什么问题?

接受的输出:

Key2
Value2

【问题讨论】:

标签: python python-3.x


【解决方案1】:

对于 Python 3,你可以简单地做

first_key = next(iter(data.keys()))
print(first_key)   # 'Key1'

【讨论】:

    【解决方案2】:

    最短的:

    mydict = {"Key1" : "Value1", "Key2" : "Value2"}
    print( next(iter(mydict)) ) # 'Key1'
    

    对于键和值:

    print( next(iter( mydict.items() )) ) # ('Key1', 'Value1')
    

    【讨论】:

      【解决方案3】:

      它确实取决于您所说的 first 是什么意思。在 Python 3.6 中,字典中的条目是按键排序的,但可能与您期望的不太一样。

      以你为例:

      >>> data = {"Key1" : "Value1", "Key2" : "Value2"}
      

      现在添加密钥0

      >>> data[0] = "Value0"
      >>> data
      {'Key1': 'Value1', 'Key2': 'Value2', 0: 'Value0'}
      

      所以最后是零。但是如果你从头开始构造字典,像这样:

      >>> data = {0: "Value0", "Key1" : "Value1", "Key2" : "Value2"}
      

      你会得到这个结果

      >>> data
      {0: 'Value0', 'Key1': 'Value1', 'Key2': 'Value2'}
      

      这说明了您不应该依赖排序的原则,排序仅由 dict 实现定义,在 CPython 3.6 及更高版本中,它是输入顺序。以不同的方式说明这一点:

      >>> data = {0: "Value0", "Key1" : "Value1", "Key2" : "Value2"}
      >>> sorted(data.keys())
      Traceback (most recent call last):
        File "<pyshell#42>", line 1, in <module>
          sorted(data.keys())
      TypeError: '<' not supported between instances of 'str' and 'int'
      

      Guido 在这个问题上是这样说的:

      我想就 ... dicts 的顺序挥手致意。是的,在 CPython 3.6 和 PyPy 它们都是有序的,但它是一个 实施细节。我不想强制所有其他 实现效仿。我也不想要太多人 开始依赖于此,因为他们的代码将在 3.5 中中断。 (代码 这需要取决于关键字 args 或类的顺序 属性应该相对不常见;但人们会开始 太容易依赖所有字典的顺序。我想提醒 他们正在冒险,他们的代码不会倒退 兼容。)

      完整的帖子是here

      【讨论】:

        【解决方案4】:

        在 python3 中,data.keys() 返回一个 dict_keys 对象,因此,一般来说,在其上应用列表以便能够对其进行索引/切片:

        data = {"Key1" : "Value1", "Key2" : "Value2"}
        print(data.keys()) 
        # output >>> dict_keys(['Key1', 'Key2'])
        print(list(data.keys())[1])   
        # output >>> Key2
        print(list(data.values())[1])
        # output >>> Value2
        

        对于您的具体情况,您需要将字典转换为有序字典以保存顺序并获取第一个元素,如下所示:

        from collections import OrderedDict 
        data = {"Key1" : "Value1", "Key2" : "Value2"}
        data = OrderedDict(data)
        print(data)
        # output >>> OrderedDict([('Key1', 'Value1'), ('Key2', 'Value2')])
        print(list(data.keys())[0])
        # output >>> Key1
        

        编辑:

        基于来自@Mseifert 的cmets(谢谢),在从无序字典转换为有序字典后保留顺序只是python3.6 中的一个实现细节,我们不能依赖,这里是Mseifert 分享的讨论:

        所以正确的做法是明确定义顺序

        from collections import OrderedDict
        data = OrderedDict([('Key1', 'Value1'), ('Key2', 'Value2')])
        print(list(data.keys())[0])
        

        【讨论】:

        • 这个答案的代码是正确的,但这是一种误导; dict 键没有排序,因此调用 list(data.keys())[0] 不会返回 dict 的“第一个”键,因为 dict 中没有“第一个键”这样的东西。
        • @bfontaine 根据OP的具体要求编辑。
        • 我没有投反对票但是当你这样做时,data = {"Key1" : "Value1", "Key2" : "Value2"} 订单消失了,之后将其转换为OrderedDict(data) 毫无意义。
        • 我在python3.6上测试过,顺序保留,请看这里:repl.it/KVt8。 @MSeifert 你能指出我的文档链接另有说明吗?
        • 即使它在 3.6 中工作(它在早期版本中不起作用,并且问题没有为 Python 3.6 明确标记)这是一个你不应该依赖的实现细节(另见 stackoverflow.com/questions/39980323/… )
        【解决方案5】:

        字典表示无序数据类型,因此没有索引。集合中有一个选项。试试 OrderedDict。

        import collections
        
        d = collections.OrderedDict()
        d['Key1'] = 'Value1'
        d['Key2'] = 'Value2' # that's how to add values to OrderedDict
        
        items = list(d.items())
        print(items)
        #[('Key1', 'Value1'), ('Key2', 'Value2')]
        print(items[0])
        #('Key1', 'Value1')
        print(items[1])
        #('Key2', 'Value2')
        

        【讨论】:

          【解决方案6】:

          字典是无序的,并且在较新的 Python 版本中,字符串的哈希值是随机的(每个会话)。所以你必须接受你作为字典的“n”键(或值)得到的东西是不可预测的(至少当键是字符串时)。

          但是,如果您只想要恰好是“第一”(或“第二”)的元素,只需使用listdict_keys 转换为可以索引的序列:

          print(list(data.keys())[1])   
          print(list(data.values())[1])
          

          但是,我的建议是使用 OrderedDict 而不是普通的 dict 来使结果具有确定性:

          from collections import OrderedDict
          data = OrderedDict([("Key1", "Value1"), ("Key2", "Value2")])
          print(list(data.keys())[1])     # Key2
          print(list(data.values())[1])   # Value2
          

          【讨论】:

            【解决方案7】:

            在 Python 中,dicts 是无序的数据结构。因此没有 first 键。如果你想拥有一个类似dict 的数据结构,其中包含键的内部排序,请查看OrderedDict

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多