Python TypeError:使用itemgetter时提示列表索引需为整数或切片
解决operator.itemgetter动态传参的TypeError问题
在使用operator.itemgetter时,直接传入整数参数(如indices = itemgetter(0,1,2,3,4,5))可以正常运行,但尝试通过inputnumbers = ''.join([k for k in range(0,len(s))])生成的内容作为参数传递时,触发错误TypeError: list indices must be integers or slices, not str。
原代码
import re, os from operator import itemgetter from pathlib import Path basepath = ["C:\\google\\serpapi\\indias\\temples\\hindu"] def mkingdirs(givenlist): mymanog = ''.join(givenlist) mk_dir = Path(mymanog) mk_dir.mkdir(parents=True, exist_ok=True) return mk_dir workingdir = mkingdirs(basepath) os.chdir(workingdir) N = "\\" cwd = os.getcwd() myd = cwd.split(N) def getstringswitch(check_string_name): dict={ 's0' : myd[0], 's1' : myd[1], 's2' : myd[2], 's3' : myd[3], 's4' : myd[4], 's5' : myd[5], 'd' : 'data', 'max_gs' : 10 } return dict.get(check_string_name, cwd) s = [] for n in range(0,len(myd)): assign = ("{}{}".format('s',n)) a = '' a = assign # 注:原代码中removen函数未定义,此处假设为自定义字符串处理函数 assign = removen(myd[n]) i = '' i = ("{}{}{}".format(a,' = ',assign)) s.append(i) indices = itemgetter(0,1,2,3,4,5) bd = (N.join(map(str, indices(myd)))) givenlist = [bd,N,getstringswitch(check_string_name = 'd')] mkdirlist = mkingdirs(givenlist) print (mkdirlist) indices = itemgetter(0,1,2,3,4,len(s)-1) # 触发错误的尝试代码 inputnumbers = ''.join([k for k in range(0,len(s))]) print(inputnumbers)
问题原因
- 你写的
''.join([k for k in range(0,len(s))])本身会触发类型错误——join要求元素是字符串,实际运行时你应该是写成了''.join([str(k) for k in range(0,len(s))]),生成的是类似"012345"的字符串。 itemgetter需要接收多个独立的整数参数,而非单个字符串参数。当你把字符串传给它时,它会尝试用这个字符串去索引列表,自然触发类型错误。
解决方案
直接生成整数序列,并用*解包传递给itemgetter:
# 替换触发错误的代码块 input_indices = range(len(s)) # 生成0到len(s)-1的整数序列 indices = itemgetter(*input_indices) # 用*解包,将每个整数作为独立参数传入 # 后续使用方式与之前一致 bd = (N.join(map(str, indices(myd))))
说明
range(len(s))生成包含所有需要索引的整数序列,用*解包后,itemgetter(*input_indices)等价于手动写出itemgetter(0,1,2,...,len(s)-1),完全符合itemgetter的参数要求,不会再触发类型错误。
内容的提问来源于stack exchange,提问作者Nature Labs
相关产品推荐
相关产品推荐

