【问题标题】:creating a new list with subset of list using index in python在python中使用索引创建一个包含列表子集的新列表
【发布时间】:2013-10-15 15:32:23
【问题描述】:

列表:

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

我想要一个使用 a[0:2],a[4], a[6:] 的子集的列表,

那是我想要一个列表['a', 'b', 4, 6, 7, 8]

【问题讨论】:

  • 好吧...如果您将示例中的, 更改为+ 以进行列表连接,您将在那里...
  • @JonClements:差不多。我想应该是a[4:5][a[4]]。但你在道德上是对的。 :^)
  • 谢谢乔恩——我就是这么做的,但是遇到了错误; DSM——谢谢,这解决了我的问题

标签: python list indexing subset


【解决方案1】:

假设

a = ['a', 'b', 'c', 3, 4, 'd', 6, 7, 8]

并且索引列表存储在

b= [0, 1, 2, 4, 6, 7, 8]

那么一个简单的单行解决方案将是

c = [a[i] for i in b]

【讨论】:

    【解决方案2】:

    试试new_list = a[0:2] + [a[4]] + a[6:]

    或者更一般地说,是这样的:

    from itertools import chain
    new_list = list(chain(a[0:2], [a[4]], a[6:]))
    

    这也适用于其他序列,并且可能会更快。

    或者你可以这样做:

    def chain_elements_or_slices(*elements_or_slices):
        new_list = []
        for i in elements_or_slices:
            if isinstance(i, list):
                new_list.extend(i)
            else:
                new_list.append(i)
        return new_list
    
    new_list = chain_elements_or_slices(a[0:2], a[4], a[6:])
    

    但请注意,如果列表中的某些元素本身就是列表,这会导致问题。 要解决此问题,请使用之前的解决方案之一,或将 a[4] 替换为 a[4:5](或更一般的将 a[n] 替换为 a[n:n+1])。

    【讨论】:

    • 感谢第二个解决方案很棒
    • 再次感谢这个函数——参数中 * 的用途是什么?
    • 使用它(我相信它被称为 splat 运算符),因此您可以为函数提供任意数量的参数。看到这个:stackoverflow.com/questions/3394835/args-and-kwargs
    • @user2783615 没问题(尽管我建议您注意该解决方案,因为它对于列表列表失败)。
    【解决方案3】:

    以下定义可能比提出的第一个解决方案更有效

    def new_list_from_intervals(original_list, *intervals):
        n = sum(j - i for i, j in intervals)
        new_list = [None] * n
        index = 0
        for i, j in intervals :
            for k in range(i, j) :
                new_list[index] = original_list[k]
                index += 1
    
        return new_list
    

    然后你可以像下面这样使用它

    new_list = new_list_from_intervals(original_list, (0,2), (4,5), (6, len(original_list)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 2021-03-06
      相关资源
      最近更新 更多