【问题标题】:Picking out items from a python list which have specific indexes从具有特定索引的 python 列表中挑选项目
【发布时间】:2010-10-18 00:19:33
【问题描述】:

我确信在 Python 中有一个很好的方法可以做到这一点,但我对这门语言还很陌生,所以如果这很简单,请原谅我!

我有一个列表,我想从该列表中挑选出某些值。我要挑选的值是列表中的索引在另一个列表中指定的值。

例如:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]

输出将是:

[9, 2, 6]

(即 main_list 中索引为 2、4 和 5 的元素)。

我觉得这应该可以使用列表推导之类的东西来实现,但我想不通(特别是,我想不出在使用列表推导时如何访问项目的索引)。

【问题讨论】:

    标签: python list indexing list-comprehension


    【解决方案1】:
    [main_list[x] for x in indexes]
    

    这将使用列表推导返回一个对象列表。

    【讨论】:

    • 列表推导非常酷,而且易于阅读。它们通常也比迭代更快。
    • 这真是太好了。正是我想要的那种东西,却没有意识到!
    • 非常pythonic
    【解决方案2】:
    t = []
    for i in indexes:
        t.append(main_list[i])
    return t
    

    【讨论】:

    • 虽然这不如列表理解那么优雅,但我更喜欢它作为对 Python 新手的回答。
    【解决方案3】:
    map(lambda x:main_list[x],indexes)
    

    【讨论】:

      【解决方案4】:

      如果你对numpy很满意:

      import numpy as np
      main_array = np.array(main_list) # converting to numpy array
      out_array = main_array.take([2, 4, 5])
      out_list = out_array.tolist() # if you want a list specifically
      

      【讨论】:

        【解决方案5】:

        我认为 Yuval A 的解决方案非常清晰和简单。但如果你真的想要一个单行列表理解:

        [e for i, e in enumerate(main_list) if i in indexes]
        

        【讨论】:

        • 其实这样更优雅:) 虽然可读性稍差
        • 啊!我就是这么想的。非常整洁!
        【解决方案6】:

        作为列表解析的替代方法,您可以将maplist.__getitem__ 结合使用。对于大型列表,您应该会看到更好的性能:

        import random
        
        n = 10**7
        L = list(range(n))
        idx = random.sample(range(n), int(n/10))
        
        x = [L[x] for x in idx]
        y = list(map(L.__getitem__, idx))
        
        assert all(i==j for i, j in zip(x, y))
        
        %timeit [L[x] for x in idx]            # 474 ms per loop
        %timeit list(map(L.__getitem__, idx))  # 417 ms per loop
        

        对于惰性迭代器,您可以使用map(L.__getitem__, idx)。注意在 Python 2.7 中,map 返回一个列表,所以不需要传递给list

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-20
          • 2017-02-08
          • 1970-01-01
          • 2021-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多