在Python中切片以反转列表的部分

4

我有一个列表,想从后往前提取一部分。只需两行代码,如下:

mylist = [...]
mysublist = mylist[begin:end]
mysublist = mysublist[::-1]

有没有一种切片表示法可以在一行内获得相同的效果?这个
mysublist = mylist[end:begin:-1]

这是不正确的,因为它包括了end元素但排除了begin元素。

mysublist = mylist[end-1:begin-1:-1]

begin为0时会失败,因为begin-1现在为-1,它被解释为mylist的最后一个元素的索引。

3个回答

6

如果 begin0,请使用 None

mysublist = mylist[end - 1:None if not begin else begin - 1:-1]

None表示“默认值”,与省略值相同。

您始终可以将条件表达式放在单独的一行上:

start, stop, step = end - 1, None if not begin else begin - 1, -1
mysublist = mylist[start:stop:step]

示例:

>>> mylist = ['foo', 'bar', 'baz', 'eggs']
>>> begin, end = 1, 3
>>> mylist[end - 1:None if not begin else begin - 1:-1]
['baz', 'bar']
>>> begin, end = 0, 3
>>> mylist[end - 1:None if not begin else begin - 1:-1]
['baz', 'bar', 'foo']

3
你可以将两行代码合并为一行:
```html

你可以将两行代码合并为一行:

```
mysublist = mylist[begin:end][::-1]

这仍然会创建两个列表对象。 - Martijn Pieters
1
@MartijnPieters,它确实可以,但这取决于您要优化什么。任务是“在一行中”完成,因此我认为可读性比效率更重要。您使用三元运算符的解决方案在技术上是无懈可击的,但我会觉得它难以阅读。 - jez

1
你可以始终使用函数变换的力量:
mysublist = list(reversed(mylist[begin:end]))

reversed() 不会返回一个列表,而是返回一个迭代器 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接