【发布时间】:2012-10-18 09:38:46
【问题描述】:
有什么简单的方法可以在 python 中反转列表切片吗?给我所有的东西除了一片?例如:
鉴于列表a = [0,1,2,3,4,5,6,7,8,9],我希望能够提取[7,8,9,0,1,2],即除a[3:7]之外的所有内容。
从逻辑上考虑,我认为 a[-3:3] 会给我想要的,但它只返回一个空列表。
我更喜欢适用于 python 2 和 3 的解决方案
【问题讨论】:
有什么简单的方法可以在 python 中反转列表切片吗?给我所有的东西除了一片?例如:
鉴于列表a = [0,1,2,3,4,5,6,7,8,9],我希望能够提取[7,8,9,0,1,2],即除a[3:7]之外的所有内容。
从逻辑上考虑,我认为 a[-3:3] 会给我想要的,但它只返回一个空列表。
我更喜欢适用于 python 2 和 3 的解决方案
【问题讨论】:
切片不会这样包装,但a[-3:] + a[:3] 会给你那个列表。
【讨论】:
如果你愿意销毁列表(或它的副本),你可以剪掉你不想要的部分:
>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> a[3:7] = []
>>> a
[0, 1, 2, 7, 8, 9]
顺序与您要求的不同,尽管这对您来说可能并不重要。
【讨论】:
Itertools 是你的朋友:
itertools.islice(itertools.cycle(a),7,13)
一般来说
itertools.islice(itertools.cycle(a),gapEnd,len(a)-gapLen)
这是一个生成器,因此您可以使用list(...) 获取列表,或者只是在循环中使用它。作为生成器,它不会创建列表的额外副本,也不会破坏原始列表等。
>>> list(itertools.islice(itertools.cycle(a),7,13))
[7, 8, 9, 0, 1, 2]
【讨论】:
1) b=a[7:10]+a[:3]
[7, 8, 9, 0, 1, 2]
2) c=list(set(a).difference([3,4,5,6]))
[0, 1, 2, 7, 8, 9]
3) lis=[i for i in a if i<3 or i >6]
[0, 1, 2, 7, 8, 9]
4) b=[3,4,5,6]
c=[i for i in a if i not in b]
【讨论】:
顺序重要吗?
>>> [j for i,j in enumerate(a) if not 3<=i<7]
[0, 1, 2, 7, 8, 9]
【讨论】:
好的,所以这可能不是您想要的,但在您可能想要这样的切片的某些情况下很有用。
有两个重要的免责声明。
list(set(a).difference(a[3:7]))
【讨论】: