考虑为什么要编制索引
首先,我要确保您确实需要对字典进行索引。 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']