为什么Python operator.itemgetter以逗号分隔的数字列表作为索引,但是当相同的列表打包在变量中时却不行?

时间:2013-07-17 22:37:33

标签: python

以下是我所遇到的问题的演示。我对Python很新,所以我很确定我忽略了一些非常明显的东西。

import operator

lista=["a","b","c","d","e","f"]
print operator.itemgetter(1,3,5)(lista)
>> ('b', 'd', 'f')

columns=1,3,5
print operator.itemgetter(columns)(lista)
>> TypeError: list indices must be integers, not tuple

如何解决此问题,以便在程序启动时使用指定为参数的任意索引列表?

2 个答案:

答案 0 :(得分:17)

这不是关于itemgetter,而是关于函数调用语法。这些是不同的东西:

operator.itemgetter(1, 3, 5)

operator.itemgetter((1, 3, 5))

第一个获得项目#1,项目#3和项目#5。第二个获得项目#(1,3,5)。 (这可能对字典有意义,但对列表没有意义。)

第二个是您使用itemgetter(columns)时获得的。那么,你怎么得到第一个?

operator.itemgetter(*columns)

就是这样。

有关详细信息,请参阅教程中的Unpacking Argument Lists

答案 1 :(得分:3)

您需要将个别参数传递给itemgettercolumns这里是一个元组(1, 3, 5)您可以使用*运算符在函数调用中解压缩它。 *扩展了一个列表或元组,使其值作为单独的参数发送,而不是将整个元组作为一个参数传递。

例如:func(*(1, 2, 3)) == func(1, 2, 3)

所以你需要的是:

columns=1,3,5
print operator.itemgetter(*columns)(lista)