如何从列表中选取多组指定索引元素,解决itemgetter不支持多组索引的问题
报错根因
itemgetter要求传入的参数是多个独立的整数/切片索引,你传入*a等于把a里的两个元组(1,2,7)、(1,2,8)直接作为索引传给了它,列表不支持用元组作为索引,所以抛出对应的类型错误。
可落地的实现方案
方案1:遍历每组索引调用itemgetter
适合需要保留itemgetter使用习惯的场景:
import itertools from operator import itemgetter labels=['C1','C2','C3','C4','C5','C6','C7','C8','C10','C13','C14','C15'] indexlist = list(itertools.combinations(range(1, 10), 3)) ixs= [4,5] a=[indexlist[ix] for ix in ixs] # 遍历每组索引取值 res = [itemgetter(*idx_group)(labels) for idx_group in a] # 按要求打印输出 for group in res: print(*group)
运行后输出结果:
C2 C3 C8 C2 C3 C10
方案2:纯列表推导式实现,无需额外导入
写法更轻量化,不需要引入operator模块:
import itertools labels=['C1','C2','C3','C4','C5','C6','C7','C8','C10','C13','C14','C15'] indexlist = list(itertools.combinations(range(1, 10), 3)) ixs= [4,5] a=[indexlist[ix] for ix in ixs] res = [tuple(labels[i] for i in idx_group) for idx_group in a] for group in res: print(*group)
运行效果和方案1完全一致。
方案3:numpy批量索引,适合大规模数据场景
如果处理的元素量级很大,用numpy的向量化索引效率更高:
import itertools import numpy as np labels = np.array(['C1','C2','C3','C4','C5','C6','C7','C8','C10','C13','C14','C15']) indexlist = list(itertools.combinations(range(1, 10), 3)) ixs= [4,5] a = np.array([indexlist[ix] for ix in ixs]) # 一步完成多组索引取值 res = labels[a] for group in res: print(*group)
内容的提问来源于stack exchange,提问作者Daniele Marinazzo
相关产品推荐
相关产品推荐

