如何让itemgetter从列表变量中获取输入?

9 投票
4 回答
6444 浏览
提问于 2025-04-18 01:40

我该如何使用 itemgetter 来处理列表变量,而不是用整数呢?

from operator import itemgetter
z = ['foo', 'bar','qux','zoo']
id = [1,3]

我这样做没有问题:

In [5]: itemgetter(1,3)(z)
Out[5]: ('bar', 'zoo')

但是当我这样做时就出错了:

In [7]: itemgetter(id)(z)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-7ba47b19f282> in <module>()
----> 1 itemgetter(id)(z)

TypeError: list indices must be integers, not list

我该如何让 itemgetter 正确地从列表变量中获取输入,也就是使用 id 呢?

4 个回答

1

实际的问题是,itemgetter 需要你把列表里的每一项单独传进去,但你现在是把整个列表作为一个整体传过去了。所以,你可以像 Aशwini चhaudhary的回答 那样进行拆解,或者你也可以像这样使用 apply 来传入这些id。

print apply(itemgetter, ids)(z)
# ('bar', 'zoo')

注意: apply 其实已经不推荐使用了。最好还是用拆解的方式。我提到 apply 只是为了完整性。

2

你可以看看这个链接:https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

itemgetter(*id)(z) 这个写法可以帮你得到你想要的东西,正如Awini Haudhary已经提到的那样。在某些情况下,把字典拆开也会很有用。

6

使用参数解包

>>> indices = [1,3]
>>> itemgetter(*indices)(z)
('bar', 'zoo')

另外,不要把id当作变量名,因为它是一个内置函数。

18

当你这样做的时候:

print itemgetter(id)(z)

你实际上是把一个 list(列表)传给了 itemgetter,而它其实是需要一些数字(索引)。

那你该怎么做呢? 你可以用 * 来展开这个 list

print itemgetter(*id)(z)

为了更好地理解,下面这两种调用方式是一样的:

print itemgetter(1, 2, 3)(z)
print itemgetter(*[1, 2, 3])(z)

撰写回答