如何不使用itemgetter、lambda或pandas将代码改为sort()排序函数?
解决方案
首先修正原代码里的缩进错误:读取CSV的循环必须放在with代码块内部,否则文件关闭后无法迭代reader对象。
针对排序需求,我们可以自定义一个简单函数替代itemgetter(0),这个函数仅返回列表的第一个元素作为排序依据,完全符合「不使用itemgetter、lambda或pandas」的要求:
def get_sort_key(item): return item[0]
之后即可用这个函数作为排序的key参数,既可以用sorted()生成新列表,也可以用列表的sort()方法原地排序(更节省内存)。
修改后的完整代码如下:
import csv mfl = [] prl = [] sdl = [] # 自定义排序用的key函数 def get_sort_key(item): return item[0] # 读取ManufacturerList.csv,修正缩进 with open("ManufacturerList.csv") as manlist: ml = csv.reader(manlist) for line in ml: mfl.append(line) # 读取PriceList.csv,修正缩进 with open("PriceList.csv") as pricelist: pl = csv.reader(pricelist) for line in pl: prl.append(line) # 读取ServiceDatesList.csv,修正缩进 with open("ServiceDatesList.csv") as sdlist: sl = csv.reader(sdlist) for line in sl: sdl.append(line) # 方式1:用sorted生成新排序后的列表 new_mfl = sorted(mfl, key=get_sort_key) new_prl = sorted(prl, key=get_sort_key) new_sdl = sorted(sdl, key=get_sort_key) # 方式2:使用list.sort()原地排序(无需生成新列表,更高效) # mfl.sort(key=get_sort_key) # prl.sort(key=get_sort_key) # sdl.sort(key=get_sort_key) # 后续直接使用mfl、prl、sdl即可 # 合并数据(注意:需使用排序后的new_prl,否则数据对应会出错) for x in range(len(new_mfl)): new_mfl[x].append(new_prl[x][1])
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

