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

时间:2014-04-07 04:45:04

标签: python operator-keyword

如何将itemgetter与list变量一起使用而不是整数? 例如:

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 个答案:

答案 0 :(得分:9)

当你这样做时:

print itemgetter(id)(z)

您正在将list传递给itemgetter,而它需要索引(整数)。

你能做什么?你可以使用list打开*

print itemgetter(*id)(z)

更好地将其可视化,以下两个调用都是等效的:

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

答案 1 :(得分:5)

使用argument unpacking

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

并且不要将id用作变量名称,它是一个内置函数。

答案 2 :(得分:2)

您可以查看https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

itemgetter(*id)(z)将得到你想要的,正如Awini Haudhary已经指出的那样。在某些情况下,解包dict也很有用。

答案 3 :(得分:1)

实际问题是,itemgetter期望将项目列表作为单个参数传递,但是您传递的是单个列表。所以,您可以像在Aशwini चhaudhary's answer中一样解压缩,也可以apply ID,就像这样

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

注意: apply实际上已弃用。总是喜欢打开包装。我只是为了完整性而提到apply