为啥不能用索引列表对列表进行索引?

Posted

技术标签:

【中文标题】为啥不能用索引列表对列表进行索引?【英文标题】:Why lists cannot be indexed with a list of indexes?为什么不能用索引列表对列表进行索引? 【发布时间】:2017-06-19 10:04:22 【问题描述】:

我在问这个问题:

Access multiple elements of list knowing their index

基本上,如果您有一个列表并且想要获取多个元素,则不能只传递索引列表。

例子:

a = [-2,1,5,3,8,5,6]
b = [1,2,5]             # list of indexes 
a[b]                    #this doesn't work
# expected output: [1,5,5]

为了解决这个问题,在链接的问题中提出了几个选项:

使用列表推导:

a = [-2,1,5,3,8,5,6]
b = [1,2,5]
c = [a[i] for i in b]

使用operator.itemgetter

from operator import itemgetter 
a = [-2, 1, 5, 3, 8, 5, 6]
b = [1, 2, 5]
print itemgetter(*b)(a)

或使用 numpy 数组(接受列表索引)

import numpy as np
a = np.array([-2, 1, 5, 3, 8, 5, 6])
b = [1, 2, 5]
print list(a[b])

我的问题是:为什么普通列表不接受这个?这不会与正常的索引 [start:end:step] 冲突,并且将提供另一种访问列表元素的方式,而无需使用外部库。

我的这个问题并不是为了吸引基于意见的答案,而是想知道 Python 中是否有这个功能不可用的具体原因,或者它是否会在未来实现。

【问题讨论】:

不太明白,你知道使用切片符号来操作列表吗? ***.com/questions/509211/… @PyNico OP 在他的问题中提到了切片表示法,但他问的是如何获取单个切片无法表示的多个元素 噢,对不起,我当时不明白。我无法回答这个问题。 你的意思是你想得到[-2,1,5,3,8,5,6][1,2,5] => [1, 5, 5] [a[i] for i in b] 有什么问题?对我来说似乎很简单。 【参考方案1】:

另一种我们可以获得预期输出的方法,它可以实现为与list相关的python函数。

a = [-2,1,5,3,8,5,6]
b = [1,2,5]
def getvalues(original_list, indexes_list):
    new_list = []
    for i in indexes_list:
        new_list.append(original_list[i])
    return new_list
result = getvalues(a, b)
print(result)

【讨论】:

以上是关于为啥不能用索引列表对列表进行索引?的主要内容,如果未能解决你的问题,请参考以下文章

Python 为啥list不能作为字典的key

如何访问 *ngFor 中的“索引”并对其进行编辑(不能删除列表中的多个项目)

Python中字典数据类型,字典.values()可以进行遍历,为啥不能通过角标进行获取元素?

为啥 TypeScript 对象不能用泛型类型索引?

python 数组和列表的区别

当我使用 set 作为捕获时,为啥 Twig 不能使用变量作为数组的索引?