【问题标题】:How do i reference values from various ranges within a list?我如何引用列表中不同范围的值?
【发布时间】:2015-07-06 18:44:31
【问题描述】:

我想做的是从一个列表中引用几个不同的范围,即我想要第 4-6 个元素、第 12-18 个元素等。这是我最初的尝试:

test = theList[4:7, 12:18]

我希望给出的内容与以下内容相同:

test = theList[4,5,6,12,13,14,15,16,17]

但是我遇到了语法错误。最好/最简单的方法是什么?

【问题讨论】:

  • test = the_list[4:7] + the_list[12:18]
  • 你是什么意思“参考”?您是否想要在原始列表中添加一种 view,以便更改对其产生影响?

标签: python list slice


【解决方案1】:

您可以添加这两个列表。

>>> theList = list(range(20))
>>> theList[4:7] + theList[12:18]
[4, 5, 6, 12, 13, 14, 15, 16, 17]

【讨论】:

  • 谢谢!!这似乎太明显了......(但在我的辩护中,我刚刚拿起了蟒蛇......)
  • 很高兴能为您提供帮助。一切顺利。 (尽快拿起蟒蛇:P)
  • 我将如何创建一个列表?对不起。我习惯了 R,在 R 中,如果我只想要一个从 1 到 7 的序列,我可以做类似 theSeq = 1:7 的事情,这将生成一个 1、2、3、4、5、6 的数组, 7.我如何在 python 中做到这一点?
  • @lukehawk 看看range 函数。你可以阅读更多关于它Python - Create list with numbers between 2 values?
【解决方案2】:

你也可以使用itertools模块:

>>> from itertools import islice,chain
>>> theList=range(20)
>>> list(chain.from_iterable(islice(theList,*t) for t in [(4,7),(12,18)]))
[4, 5, 6, 12, 13, 14, 15, 16, 17] 

请注意,由于 islice 在每次迭代中都会返回一个生成器,因此它在内存使用方面比列表切片执行得更好。

您还可以使用函数获取更多索引和通用方式。

>>> def slicer(iterable,*args):
...    return chain.from_iterable(islice(iterable,*i) for i in args)
... 
>>> list(slicer(range(40),(2,8),(10,16),(30,38)))
[2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 30, 31, 32, 33, 34, 35, 36, 37]

注意:如果要循环遍历结果,则不需要将结果转换为 list!

【讨论】:

    【解决方案3】:

    您可以按照@Bhargav_Rao 的说明添加这两个列表。更一般地说,您还可以使用列表生成器语法:

    test = [theList[i] for i in range(len(theList)) if 4 <= i <= 7 or 12 <= i <= 18]
    

    【讨论】:

      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2017-12-18
      • 1970-01-01
      相关资源
      最近更新 更多