目录
TypeError: ‘dict_keys’ object is not subscriptable (Python)
- TypeError: ‘dict_keys’ 对象不可订阅
- TypeError: ‘generator’ 对象在 Python 中不可订阅
- TypeError: ‘map’ 对象在 Python 中不可订阅
TypeError: ‘dict_keys’ 对象不可订阅 (Python)
当我们尝试访问特定索引处的 dict_keys 对象时,会出现 Python“TypeError: ‘dict_keys’ object is not subscriptable”。
要解决该错误,请dict_keys
在访问索引之前将对象转换为列表,例如list(my_dict.keys())[0]
.
下面是错误如何发生的示例。
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
,最后一项的索引为-1
或len(a_list) - 1
。
TypeError: ‘dict_values’ 或 ‘dict_items’ 对象不可订阅
如果您遇到以下错误之一,解决方案是相同的:
- TypeError: ‘dict_values’ 对象不可订阅
- TypeError: ‘dict_items’ 对象不可订阅
在通过索引访问它之前,您必须将dict_values
ordict_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__)
目录
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
或者,您可以将 传递generator
给next()
函数以检索下一项。
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))
.
下面是错误如何发生的示例。
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__)
# 额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: