从给定列表和给定索引中提取列表

时间:2015-06-28 05:40:26

标签: python list

我有一个列表包含或多或少的随机值。列表始终具有固定长度。 我有另一个包含整数值的列表。这些值始终小于第一个列表的长度。

我想计算一个列表,其中包含第一个列表中的所有值,其索引由第二个列表中的值描述。 我想出了以下内容:

>>> values = ['000', '111', '222', '333', '444', '555', '666', '777']
>>> indices = [2, 4, 7]
>>> [v for i, v in enumerate(values) if i in indices]
['222', '444', '777']

由于我的名单相当小(24个元素),这对我来说没问题。无论如何,我想知道是否有更优雅的解决方案,不计算临时列表(enumerate())。

1 个答案:

答案 0 :(得分:3)

>>> values = ['000', '111', '222', '333', '444', '555', '666', '777']
>>> indices = [2, 4, 7]
  1. 您可以使用简单的列表理解

    >>> [values[index] for index in indices]
    ['222', '444', '777']
    
  2. 您可以使用operator.itemgetter,就像这样

    >>> from operator import itemgetter
    >>> itemgetter(*indices)(values)
    ('222', '444', '777')
    >>> list(itemgetter(*indices)(values))
    ['222', '444', '777']
    
  3. 或者您可以使用__getitem__调用魔术方法map,就像这样

    >>> map(values.__getitem__, indices)
    ['222', '444', '777']
    

    如果您使用的是Python 3.x,那么您可能希望将listmap

    一起使用
    >>> list(map(values.__getitem__, indices))
    ['222', '444', '777']
    
  4. 如果您不想创建整个列表,那么您可以创建一个生成器表达式并使用next来获取值。

    >>> filtered = (values[index] for index in indices)
    >>> next(filtered)
    '222'
    >>> next(filtered)
    '444'
    >>> next(filtered)
    '777'
    >>> next(filtered)
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    StopIteration
    

    如果您只是迭代结果,那么我建议使用生成器表达式方法。

    >>> for item in (values[index] for index in indices):
    ...     print(item + ' ' + item)
    ...     
    222 222
    444 444
    777 777