使用另一个列表的值对列表进行索引(Python)
嘿,这个需求其实挺常见的,我分两种典型场景给你拆解,你对应自己的实际情况选方法就行:
情况1:
idx是索引值列表(比如存的是mylist里元素的位置,像[0,2,3]这种) 这种场景下,核心就是根据索引直接取元素,有两种常用方法:
方法一:列表推导式(新手友好,直观易懂)
直接遍历idx里的每个索引,取出mylist对应位置的元素:mylist = ["apple", "banana", "cherry", "date"] idx = [0, 2, 3] result = [mylist[i] for i in idx] # 输出结果:["apple", "cherry", "date"]优点是代码简单,一眼就能看懂,小数据量下完全够用。
方法二:用
operator.itemgetter(大数据量更高效)
如果你的列表很大,或者需要批量取多个索引,用这个方法效率更高:from operator import itemgetter mylist = ["apple", "banana", "cherry", "date"] idx = [0, 2, 3] result = list(itemgetter(*idx)(mylist)) # 输出结果和上面一致原理是
itemgetter(*idx)会生成一个函数,一次性取出所有指定索引的元素,最后转成列表即可。
情况2:
idx是布尔值列表(和mylist长度一致,True表示要保留对应元素) 比如idx是[True, False, True, True],这种场景需要把元素和对应的布尔标记配对筛选:
方法一:列表推导式+
zip配对
用zip把mylist的元素和idx的布尔值一一配对,然后只保留标记为True的元素:mylist = ["apple", "banana", "cherry", "date"] idx = [True, False, True, True] result = [item for item, keep in zip(mylist, idx) if keep] # 输出结果:["apple", "cherry", "date"]逻辑清晰,不需要额外导入模块,日常用得最多。
方法二:用numpy(适合大型数据集)
如果你的项目已经在使用numpy,这种方式会更简洁:import numpy as np mylist = ["apple", "banana", "cherry", "date"] idx = [True, False, True, True] arr = np.array(mylist) result = arr[idx].tolist() # 输出结果相同把列表转成numpy数组后,直接用布尔索引就能筛选元素,最后转回普通列表即可,处理大数据时速度优势明显。
小提醒
- 如果是索引列表,要确保所有索引都在
mylist的有效范围内(比如mylist长度是4,索引不能≥4或者<0),不然会报IndexError。 - 如果是布尔列表,最好保证它的长度和
mylist一致,不然zip会以较短的那个列表为准,可能导致筛选结果不符合预期。
内容的提问来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

