【问题标题】:How can I make itemgetter to take input from list variable?如何让 itemgetter 从列表变量中获取输入?
【发布时间】:2014-05-19 04:27:15
【问题描述】:

如何将 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

【问题讨论】:

    标签: python operator-keyword


    【解决方案1】:

    当你这样做时:

    print itemgetter(id)(z)
    

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

    你能做什么?你可以使用*解压list

    print itemgetter(*id)(z)
    

    为了更好地可视化这一点,以下两个调用是等效的:

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

    【讨论】:

      【解决方案2】:

      使用argument unpacking:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          注意: apply 实际上已被弃用。总是喜欢拆包。为了完整起见,我提到了apply

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-24
            • 1970-01-01
            • 2014-01-30
            相关资源
            最近更新 更多