【问题标题】:Complex list slice/index in pythonpython中的复杂列表切片/索引
【发布时间】:2012-12-16 09:09:35
【问题描述】:

我有一个如下所示的列表:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

我想生成一个如下所示的过滤列表:

filtered_lst = [2, 6, 7, 9, 10, 13]

Python 是否提供自定义切片的约定。比如:

lst[1, 5, 6, 8, 9, 12] # slice a list by index

【问题讨论】:

    标签: python list slice


    【解决方案1】:

    使用operator.itemgetter():

    from operator import itemgetter
    
    itemgetter(1, 5, 6, 8, 9, 12)(lst)
    

    演示:

    >>> from operator import itemgetter
    >>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    >>> itemgetter(1, 5, 6, 8, 9, 12)(lst)
    (2, 6, 7, 9, 10, 13)
    

    这会返回一个元组;如果需要,则使用 list(itemgetter(...)(lst)) 强制转换为列表。

    请注意,这等效于具有一组索引而不是范围的切片表达式 (lst[start:stop]);它不能用作左侧切片赋值 (lst[start:stop] = some_iterable)。

    【讨论】:

    • 使用切片可以修改底层列表。你能用 itemgetter 做到这一点吗?
    • *mumble mumble* "一种方法" *mumble mumble mumble* ;)
    • @DavidHeffernan:你不能把它用作左手赋值目标,不。
    • 既然问题明确提到了切片,也许你应该在答案中提到左手赋值
    • @DavidHeffernan: 'slice' 也可以表示扩展切片(python 不支持 list 类型),确实允许使用 [index1, index2, .., indexn] 表示法。切片表达式的 result 是一个新列表,这就是我认为 OP 所追求的。 :-) 切片的 other 用途是作为分配目标,这就是我认为您的意思,这超出了这里的范围。我想只是在这里整理一下我们的术语! :-)
    【解决方案2】:

    我会使用 Martijn Pieters 建议的 operator.itemgetter() 方法,但这是另一种方法(为了完整性)

    In [23]: lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    
    In [24]: indices = set([1, 5, 6, 8, 9, 12])
    
    In [25]: [n for i,n in enumerate(lst) if i in indices]
    Out[25]: [2, 6, 7, 9, 10, 13]
    

    【讨论】:

      【解决方案3】:

      Numpy 数组有这种切片语法:

      In [45]: import numpy as np
      
      In [46]: lst = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13])
      
      In [47]: lst[[1, 5, 6, 8, 9, 12]]
      Out[47]: array([ 2,  6,  7,  9, 10, 13])
      

      【讨论】:

        【解决方案4】:

        Python 切片允许您将切片作为赋值的目标。并且 Python 切片语法不允许具有不规则索引模式的切片。所以,如果你想让你的“自定义”切片成为赋值的目标,那么 Python 切片语法是不可能的。

        如果通过获取指定元素的副本来满足您的要求,那么operator.itemgetter() 满足您的需求。如果您需要切片分配,那么 numpy 切片是一个不错的选择。

        【讨论】:

          【解决方案5】:

          使用列表推导可以轻松直接地完成。

          lst = range(1, 14)
          indices = [1, 5, 6, 8, 9, 12]
          filtered_lst = [lst[i] for i in indices]
          

          【讨论】:

            猜你喜欢
            • 2021-12-02
            • 1970-01-01
            • 2018-12-02
            • 2013-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-14
            相关资源
            最近更新 更多