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

基于索引的python列表优雅切片

  •  2
  • mad_  · 技术社区  · 6 年前

    temp = ['a','b','c','d']
    
    index_needed=[0,2]
    

    如果没有循环,我如何分割列表?

    output_list =['a','c']
    

    我有预感会有办法的,但还没想好。有什么建议吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   jpp    6 年前

    首先,注意Python中的索引从0开始。所以你需要的指数是 [0, 2] .

    然后可以使用列表理解:

    temp = ['a', 'b', 'c', 'd']
    idx = [0, 2]
    
    res = [temp[i] for i in idx]            # ['a', 'c']
    

    map

    res = map(temp.__getitem__, idx)        # ['a', 'c']
    

    因为您使用的是Python2.7,所以这将返回一个列表。对于Python3.x,您需要传递 反对 list .


    如果希望完全避免Python级别的循环,则可能希望使用第三方库,如NumPy:

    import numpy as np
    
    temp = np.array(['a', 'b', 'c', 'd'])
    res = temp[idx]
    
    # array(['a', 'c'], 
    #       dtype='<U1')
    
    res2 = np.delete(temp, idx)
    
    # array(['b', 'd'], 
    #       dtype='<U1')
    

    这将返回一个NumPy数组,然后可以通过 res.tolist() .

        2
  •  1
  •   Idrisi_Kasim    5 年前

    使用这个:

    temp = ['a','b','c','d']
    
    temp[0:4:2]
    
    #Output
    ['a', 'c']
    

    快乐学习…:)

        3
  •  0
  •   ShadowRanger    6 年前

    另一种方法是将工作推送到CPython(引用解释器)上的C层:

    from operator import itemgetter
    
    temp = ['a','b','c','d']
    
    index_needed=[0,2]
    
    output_list = itemgetter(*index_needed)(temp)
    

    又回来了 tuple 价值;如果 list 是必要的,只要把 施工单位:

    output_list = list(itemgetter(*index_needed)(temp))
    

    itemgetter 是基于如何初始化的变量返回类型,在传递单个要拉的键时直接返回值,以及 元组 传递多个键时的值。

    一次性使用也不是特别有效。一个更常见的用例是如果您有一个iterable的序列(通常 s、 但任何序列都有效),而且不在乎它们。例如,输入 列表

    allvalues = [(1, 2, 3, 4),
                 (5, 6, 7, 8)]
    

    如果只需要索引1和3中的值,可以编写如下循环:

    for _, x, _, y in allvalues:
    

    将所有值解包,但将不关心的值发送给 _ 表示不感兴趣,或者您可以使用 map

    from future_builtins import map  # Because Py2's map is terrible; not needed on Py3
    
    for x, y in map(itemgetter(1, 3), allvalues):
    

    这个 项目获取器 allvalues ,而手动解包通常只需要四个;更好的是主要基于您的用例。