TypeError: ‘dict_keys’ 对象不可订阅 (Python)

目录

TypeError: ‘dict_keys’ object is not subscriptable (Python)

  1. TypeError: ‘dict_keys’ 对象不可订阅
  2. TypeError: ‘generator’ 对象在 Python 中不可订阅
  3. TypeError: ‘map’ 对象在 Python 中不可订阅

TypeError: ‘dict_keys’ 对象不可订阅 (Python)

当我们尝试访问特定索引处的 dict_keys 对象时,会出现 Python“TypeError: ‘dict_keys’ object is not subscriptable”。

要解决该错误,请dict_keys在访问索引之前将对象转换为列表,例如list(my_dict.keys())[0].

typeerror 字典键对象不可订阅

下面是错误如何发生的示例。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} keys = my_dict.keys() print(type(keys)) # 👉️ <class 'dict_keys'> # ⛔️ TypeError: 'dict_keys' object is not subscriptable print(keys[0])

请注意,该dict.keys()方法返回一个dict_keys对象,而不是一个list.

将对象转换dict_keys为列表

要解决该错误,请将dict_keys对象传递给list构造函数以将其转换为列表,然后再访问特定索引处的列表项。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ✅ convert to list keys = list(my_dict.keys()) print(keys[0]) # 👉️ "name" print(keys[1]) # 👉️ "age" print(keys[0:2]) # 👉️ ['name', 'age']

dict.keys
方法返回字典键的新视图

由于dict_keys对象不可订阅,我们无法在特定索引处访问它们。

dict_keys对象转换为列表后,您还可以使用列表切片。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30, 'country': 'Belgium'} keys = list(my_dict.keys()) print(keys[0:2]) # 👉️ ['name', 'age'] print(keys[1:3]) # 👉️ ['age', 'country']

列表切片的语法
a_list[start:stop:step].

索引start是包含的,stop索引是排他的(最多,但不包括)。

如果start省略索引,则认为是0,如果stop省略索引,则切片转到列表的末尾。

Python 索引是从零开始的,因此列表中的第一项的索引为0,最后一项的索引为-1len(a_list) - 1

TypeError: ‘dict_values’ 或 ‘dict_items’ 对象不可订阅

如果您遇到以下错误之一,解决方案是相同的:

  • TypeError: ‘dict_values’ 对象不可订阅
  • TypeError: ‘dict_items’ 对象不可订阅

在通过索引访问它之前,您必须将dict_valuesordict_items对象转换为列表。

这是一个为dict_values.

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ✅ convert to list values = list(my_dict.values()) print(values[0]) # 👉️ "Bobby Hadz" print(values[1]) # 👉️ 30 print(values[0:2]) # 👉️ ['Bobby Hadz', 30]

这是一个为dict_items.

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} # ✅ convert to list items = list(my_dict.items()) print(items[0]) # 👉️ ('name', 'Bobby Hadz') print(items[1]) # 👉️ ('age', 30) print(items[0:2]) # 👉️ [('name', 'Bobby Hadz'), ('age', 30)]

遍历字典的键

您可以遍历字典的键,而不必将
dict_keys对象转换为列表。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30, 'country': 'Belgium'} for key in my_dict.keys(): # name # age # country print(key)

在每次迭代中,我们都可以访问当前密钥并打印结果。

如果您需要访问当前迭代的值,请改用该dict.items()
方法。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30, 'country': 'Belgium'} for key, value in my_dict.items(): # name Bobby Hadz # age 30 # country Belgium print(key, value)

处理超出范围的异常try/except

请注意,如果您尝试访问越界的列表索引,您将收到错误消息。

如果需要处理,可以使用
try/except语句。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30} keys = list(my_dict.keys()) try: print(keys[100]) except IndexError: print('index out of bounds') # 👉️ this runs

该示例捕获IndexError索引超出范围时抛出的 。

IndexError请注意,使用列表切片时不会引发an ,即使指定的索引不存在也是如此。

主程序
my_dict = {'name': 'Bobby Hadz', 'age': 30, 'country': 'Belgium'} keys = list(my_dict.keys()) print(keys[100:200]) # 👉️ [] print(keys[1:100]) # 👉️ ['age', 'country']

列表构造函数采用可迭代对象(例如对象)并将dict_keys其转换为列表。

构造list函数构建一个列表,其项目与 iterable 的项目相同且顺序相同。

构造list函数接受一个可迭代对象,它可以是一个序列、一个支持迭代的容器或一个迭代器对象。

您应该只使用方括号来访问可订阅对象。

Python 中的可订阅对象是:

  • 列表
  • 元组
  • 字典
  • 细绳

所有其他对象都必须通过使用
list()tuple()
dict()
str()类转换为可订阅对象才能使用括号表示法。

可订阅对象实现该__getitem__方法,而非可订阅对象不实现。

主程序
a_list = [2, 4, 6, 8] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)

目录

  1. TypeError: ‘generator’ 对象在 Python 中不可订阅
  2. TypeError: ‘map’ 对象在 Python 中不可订阅

TypeError: ‘generator’ 对象在 Python 中不可下标

当我们尝试访问特定索引处的生成器对象时,会出现 Python“TypeError: ‘generator’ object is not subscriptable”。

要解决错误,请将生成器传递给列表构造函数,例如
list(gen)[0].

类型错误生成器对象不可订阅

这是错误发生方式的示例

主程序
def g(): yield 1 yield 2 yield 3 gen = g() print(type(gen)) # ⛔️ TypeError: 'generator' object is not subscriptable print(gen[0])

我们使用方括号尝试访问 index 处的元素0,但该
generator对象不可订阅。

generator我们可以通过将对象转换为列表来解决这个问题。

主程序
def g(): yield 1 yield 2 yield 3 # ✅ convert generator object to list my_list = list(g()) print(my_list) # 👉️ [1, 2, 3] print(my_list[0]) # 👉️ 1 print(my_list[1]) # 👉️ 2

generator列表对象是可订阅的,因此我们可以在将对象转换为列表后访问特定索引处的元素。

您可以使用简单的for 循环遍历生成器

主程序
def g(): yield 1 yield 2 yield 3 gen = g() for i in gen: print(i) # 👉️ 1, 2, 3

或者,您可以将 传递generatornext()函数以检索下一项。

主程序
def g(): yield 1 yield 2 yield 3 gen = g() print(next(gen)) # 👉️ 1 print(next(gen)) # 👉️ 2 print(next(gen)) # 👉️ 3

请注意,如果您尝试访问越界的列表索引,您将收到错误消息。try/except如果需要处理,可以使用语句。

主程序
def g(): yield 1 yield 2 yield 3 my_list = list(g()) try: print(my_list[100]) except IndexError: print('index out of bounds') # 👉️ this runs

该示例捕获IndexError索引超出范围时抛出的 。

列表构造函数采用可迭代对象(例如对象)并将generator其转换为列表。

构造list函数构建一个列表,其项目与 iterable 的项目相同且顺序相同。

构造list函数接受一个可迭代对象,它可以是一个序列、一个支持迭代的容器或一个迭代器对象。

您应该只使用方括号来访问可订阅对象。

Python 中的可订阅对象是:

  • 列表
  • 元组
  • 字典
  • 细绳

必须使用
list()tuple()或类将所有其他对象dict()转换为可订阅对象str()才能使用方括号表示法。

可订阅对象实现该__getitem__方法,而非可订阅对象不实现。

主程序
a_list = ['bobby', 'hadz', 'com'] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)

TypeError: ‘map’ 对象在 Python 中不可下标

map当我们尝试访问特定索引处的对象时,会出现 Python“TypeError: ‘map’ object is not subscriptable” 。

要解决该错误,请先将map对象转换为列表,然后再通过索引访问它,例如new_list = list(map(int, a_list)).

typeerror 映射对象不可订阅

下面是错误如何发生的示例。

主程序
a_list = ['2', '4', '6', '8'] new_list = map(int, a_list) print(new_list) # 👉️ <map object at 0x7fde832679a0> # ⛔️ TypeError: 'map' object is not subscriptable print(new_list[0])

在 Python 3 中,该map()函数返回一个map对象,而不是列表。

要解决该错误,请使用该类list()将对象转换为列表。 map
主程序
a_list = ['2', '4', '6', '8'] new_list = list(map(int, a_list)) print(new_list) # 👉️ [2, 4, 6, 8] print(new_list[0]) # 👉️ 2

map ()函数将一个函数和一个可迭代对象作为参数,并使用可迭代对象的每个项目调用该函数。

该函数返回一个map对象,map对象不可订阅(无法通过索引访问)。

如果需要访问,可以使用方括号:

  • 特定索引处的列表
  • 特定索引处的元组
  • 特定索引处的字符串
  • 字典中的特定键
解决错误的另一种方法是使用for循环迭代map对象,而不必将其转换为列表。
主程序
a_list = ['2', '4', '6', '8'] new_list = [] map_obj = map(int, a_list) for item in map_obj: print(int(item)) new_list.append(int(item)) print(new_list) # 👉️ [2, 4, 6, 8] print(new_list[0]) # 👉️ 2 print(new_list[:2]) # 👉️ [2, 4]

Map 对象是惰性求值的,所以我们使用循环for来遍历对象。

您可以选择将使用每个项目调用函数的结果追加到列表中。

比必须将
地图对象转换为列表更好的方法是使用列表理解。

主程序
a_list = ['2', '4', '6', '8'] new_list = [int(item) for item in a_list] print(new_list) # 👉️ [2, 4, 6, 8]

我们使用
列表理解来迭代原始列表。

列表推导用于对每个元素执行某些操作或选择满足条件的元素子集。

在每次迭代中,我们用当前项调用
int()类并返回结果。

列表理解返回一个包含结果的新列表。

列表理解可以用作map 函数的替代品。您所要做的就是对每个列表项调用一个函数并返回结果。

您还可以使用列表理解或map具有用户定义函数的函数。

主程序
def do_math(a): return a + 100 a_list = [2, 4, 6, 8] result = list(map(do_math, a_list)) print(result) # 👉️ [102, 104, 106, 108] print(result[0]) # 👉️ 102 result = [do_math(item) for item in a_list] print(result) # 👉️ [102, 104, 106, 108] print(result[0]) # 👉️ 102

该错误基本上意味着无法使用方括号访问该对象。

您应该只使用方括号来访问可订阅对象。

Python 中的可订阅对象是:

  • 列表
  • 元组
  • 字典
  • 细绳

必须使用
list()tuple()或类将所有其他对象dict()转换为可订阅对象str()才能使用方括号表示法。

可订阅对象实现该__getitem__方法,而非可订阅对象不实现。

主程序
a_list = [1, 2, 3] # 👇️ <built-in method __getitem__ of list object at 0x7f71f3252640> print(a_list.__getitem__)

# 额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: