代码之家  ›  专栏  ›  技术社区  ›  Ben

从具有特定索引的python列表中挑选项

  •  26
  • Ben  · 技术社区  · 16 年前

    我确信有一种很好的方法可以在Python中实现这一点,但我对该语言还很陌生,所以如果这是一种简单的方法,请原谅我!

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

    例如:

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

    输出将是:

    [9, 2, 6]
    

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

    我有一种感觉,使用列表理解应该是可行的,但是我无法理解(特别是,在使用列表理解时,我无法理解如何访问项目的索引)。

    5 回复  |  直到 16 年前
        1
  •  82
  •   Matthew Schinckel    16 年前
    [main_list[x] for x in indexes]
    

    这将使用列表理解返回对象列表。

        2
  •  4
  •   Yuval Adam    16 年前
    t = []
    for i in indexes:
        t.append(main_list[i])
    return t
    
        3
  •  1
  •   unbeknown    16 年前

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

    [e for i, e in enumerate(main_list) if i in indexes]
    
        4
  •  1
  •   Thor    13 年前
    map(lambda x:main_list[x],indexes)
    
        5
  •  0
  •   jpp    7 年前

    作为列表理解的替代方法,您可以使用 map 具有 list.__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中, 地图 返回一个列表,因此无需传递给 list .