【问题标题】:How to index into a dictionary?如何索引到字典中?
【发布时间】:2011-05-18 14:52:44
【问题描述】:

我在下面有一个字典:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

如何索引字典中的第一个条目?

colors[0] 将返回 KeyError,原因很明显。

【问题讨论】:

标签: python dictionary indexing


【解决方案1】:

如果有人还在看这个问题,那么当前接受的答案现在已经过时了:

Since Python 3.7*,字典是order-preserving,也就是说它们现在的行为类似于collections.OrderedDicts。不幸的是,仍然没有专门的方法来索引到字典的keys()/values(),所以获取字典中的第一个键/值可以这样做

first_key = list(colors)[0]
first_val = list(colors.values())[0]

或者(这样可以避免将键视图实例化为列表):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

如果你需要一个n-th 键,那么类似

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

* CPython 3.6 已经包含了按插入顺序排列的字典,但这只是一个实现细节。语言规范包括从 3.7 开始的插入顺序字典。

【讨论】:

  • 能否提供相应文档的链接?
【解决方案2】:

字典在 Python 3.6 及之前的版本中是无序的。如果您不关心条目的顺序并希望通过索引访问键或值,您可以使用keys = list(d) 为字典d 创建一个键列表,然后按索引访问列表中的键keys[i],以及与 d[keys[i]] 关联的值。

如果您确实关心条目的顺序,从 Python 2.7 开始,您可以使用 collections.OrderedDict。或者使用一对列表

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

如果您不需要按键访问。 (顺便说一下,为什么你的数字是字符串?)

在 Python 3.7 中,普通字典是有序的,因此您不再需要使用 OrderedDict(但您仍然可以 - 它基本上是相同的类型)。 Python 3.6 的 CPython 实现已经包含了该更改,但由于它不是语言规范的一部分,因此您不能在 Python 3.6 中依赖它。

【讨论】:

  • 在 Python 2 中,使用 d.iterkeys().next() 而不是 d.keys()[0] 来检查其中一个键而不删除它。如果字典很大,它将在性能方面产生很大的不同。值和项目也是如此。在 Python 2.7 中,您还可以使用 dict view objects
  • 在 Python 3 中,这些调用返回一个视图,而不是一个实际的列表,因此您应该将它们包装在对 list() 的调用中,否则您将看到:“TypeError: 'dict_values' object does not support索引”。看到这个 S.O.问题:stackoverflow.com/questions/17431638/…
  • 只是一点点更正:你不能索引 items(),至少在 Python 3 中不能。
  • 此答案对于 python 3.6+ 已过时,请参阅下面@Pasha 的答案。
  • @hans 这个答案对于 Python 3.7 来说已经过时了,但对于 Python 3.6 来说不是,因为字典的顺序保留特性是该 Python 版本的 CPython 实现的实现细节,而不是官方的一部分语言。我会相应地更新这个答案。
【解决方案3】:

如果需要有序字典,可以使用odict

【讨论】:

  • odict 认为不支持对 keys()、values() 或 items() 的索引。
【解决方案4】:

解决字典元素就像坐在驴子上享受骑行。

作为 Python 的规则,DICTIONARY 是无序的

如果有

dic = {1: "a", 2: "aa", 3: "aaa"}

现在假设如果我喜欢dic[10] = "b",那么它不会总是这样添加

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

可能是这样的

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

或者

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

或者

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

或任何这样的组合。

所以经验法则是 DICTIONARY无序

【讨论】:

  • 这很简洁……我喜欢!
  • 在 python >3.6 字典中保留它的顺序,所以这个答案可能很简单,但也有误导性。在 python >3.6 中,@RajDamani 代表的代码总是导致{1:"a",2:"aa",3:"aaa",10:"b"}
【解决方案5】:

其实我找到了一个新颖的解决方案,确实帮了我很大的忙,如果你特别关心列表或数据集中某个值的索引,你可以将字典的值设置为那个索引!:

观看:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

现在通过哈希图的强大功能,您可以在恒定时间内提取条目的索引(也就是更快)

【讨论】:

  • 可能希望使用与 list 不同的变量名称,因为您正在隐藏列表的内置构造函数 list()
【解决方案6】:

哦,这很难。基本上,您在这里拥有的是每个项目的两个值。然后你试图用一个数字作为键来呼叫他们。不幸的是,您的某个值已被设置为键!

试试这个:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

现在您可以按数字调用键,就像它们像列表一样被索引。您还可以通过它们在列表中的位置来引用颜色和编号。

例如,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

当然,您必须想出另一种方法来跟踪每种颜色的位置。也许您可以有另一个字典来存储每种颜色的键作为它的值。

colors_key = {'blue': 1, 'red': 6, 'ylow': 8}

然后,如果需要,您还可以查找颜色键。

colors[colors_key['blue']][0] 将返回 'blue'

类似的东西。

然后,当您使用它时,您可以使用数字值作为键创建一个 dict,这样您就可以随时使用它们来查找您的颜色,如果您需要的话。

值 = {5: [1, 'blue'], 6: [2, 'red'], 8: [3, 'yellow']}

然后,(colors[colors_key[values[5][1]]][0]) 将返回“蓝色”。

或者您可以使用列表列表。

祝你好运!

【讨论】:

    【解决方案7】:

    你不能,因为dict 是无序的。您可以使用.popitem() 获取任意项目,但这会将其从字典中删除。

    【讨论】:

    • next(iter(d.items()))(Python 2 中的.iteritems())也为您提供了一个任意项目(在我的测试中也是如此,这很有意义,因为 popitem 可以使用它来实现)但不会删除项目。
    【解决方案8】:

    考虑为什么要编制索引

    首先,我要确保您确实需要对字典进行索引。 dict 最初的目的是甚至没有顺序,所以也许有替代方法来解决使用现有基础 Python 数据类型的优势进行索引的需求。

    例如,如果您有一个按特定顺序需要的颜色列表,只需存储颜色列表,然后对这些颜色进行索引,然后将它们输入 dict 以获取值。

    color_order = [ 'blue', 'yellow', 'yellow', 'blue' ]
    value_0 = colors[color_order[0]]
    

    另一方面,如果您需要一些默认颜色值作为索引 0,请考虑使用单独的值来存储默认值,或者添加一个设置默认值的附加条目,您只需键入即可,而不必索引:

    default_color = 'blue'
    default_value = colors[default_color]
    
    colors = { 'default': '5', 'blue': '5', 'red': '6', 'yellow': '8' }
    default_value = colors['default']
    

    用函数查找索引

    您可以通过循环计数到dict.keys() 来找到字典索引。如果你使用enumerate()函数,它会自动生成索引值。

    这是最直接的方法,但每次查找索引时都会消耗更多 CPU。这假定了一个有序的字典(Python 3.7+ 保证了这一点)。

    在给定索引处查找键:

    def key_at_index(mydict, index_to_find):
      for index, key in enumerate(mydict.keys()):
        if index == index_to_find:
          return key
      return None  # the index doesn't exist
    

    查找键的索引:

    def index_of_key(mydict, key_to_find):
      for index, key in enumerate(mydict.keys()):
        if key == key_to_find:
          return index
      return None  # the key doesn't exist
    

    创建键列表

    如果您需要一个会被大量访问的解决方案,您可以创建一个复制当前字典中的键的键列表,然后在您知道索引的情况下将其索引到列表中,或者使用list.index(item)列表的方法来查找索引。列表比创建带有索引的 dict 更可取,因为列表本身已经具有索引,并且内置函数通常更快并且更有可能正确处理边缘和角落情况。

    这种方法有额外的开销,但如果您正在进行大量数据分析并且需要定期访问索引,那么它可能是值得的。

    # Note: you don't actually need the `.keys()`, but it's easier to understand
    colors_i = list(colors.keys())
    index_blue = colors.index('blue')
    index0 = colors_i[0]
    value0 = colors[index0]
    
    print(f'colors: {colors}\ncolor_i: {colors_i}')
    print(f'index_blue = {index_blue}, index0 = "{index0}", value0 = "{value0}"')
    # colors: {'blue': '5', 'red': '6', 'yellow': '8'}
    # color_i: ['blue', 'red', 'yellow']
    # index_blue = 0, index0 = "blue", value0 = "5"
    

    注意:这是静态的,如果您的源字典得到更新,则不会更新。您需要将新项目添加到列表和字典中以使它们保持同步

    更新字典和列表的功能

    下面是一个同时更新你的字典和索引列表的函数。如果一个 item 已经存在,它会更新 value 而不会将它添加到列表中(否则列表中会有重复的条目,而 dict 只会更新现有的条目)。

    如果进行大量处理,这种方法可以扩展为一个类,特别是如果在此之上还需要其他扩展功能。

    def index_add_item(mydict, index_list, key, value):
      # Note: The dict and list are passed by reference, so we can just update them
      try: # in case key doesn't exist
        existing_value = colors[key]
      except KeyError: # key does not exist, update dict and list
        mydict.update({key: value})
        index_list.append(key)
      else: # key already exists, just update value
        mydict[key] = value
    
    index_add_item(colors, colors_i, 'purple', '99')
    print(f'colors: {colors}\ncolors_i: {colors_i}')
    # colors: {'blue': '5', 'red': '6', 'yellow': '8', 'purple': '99'}
    # colors_i: ['blue', 'red', 'yellow', 'purple']
    
    index_add_item(colors, colors_i, 'blue', '1')
    print(f'colors: {colors}\ncolors_i: {colors_i}')
    # colors: {'blue': '1', 'red': '6', 'yellow': '8', 'purple': '99'}
    # colors_i: ['blue', 'red', 'yellow', 'purple']
    

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      • 2021-10-24
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多