为什么我不能在条件表达式中放置切片,我能做什么?

Why can't I put a slice in a conditional expression, and what can I do instead?

提问人:Matteo 提问时间:9/16/2023 最后编辑:wjandreaMatteo 更新时间:9/17/2023 访问量:84

问:

我需要以这种方式从列表和索引号中获取一系列列表:[1,2,3,4,5,6]2

[1,2]
[2]
[]
[3]
[3,4]
[3,4,5]
[3,4,5,6]

我发现这对循环有效

lst = [1,2,3,4,5,6]
index = 2
for i in range(len(lst)+1):
    print(lst[(i if i<index else index):(index if i<index else i)])

但这种简化形式并非如此

lst = [1,2,3,4,5,6]
index = 2
for i in range(len(lst)+1):
    print(lst[(i:index) if i<index else (index:i)])

你知道为什么它不起作用吗,是否有办法让它起作用,或者有其他方法可以达到相同的结果?

Python 切片

评论

1赞 wjandrea 9/17/2023
请写一个更具体的标题,例如“为什么我不能在条件表达式中放置切片[如果您愿意,也可以使用”三元“,以及我能做什么?请参阅“如何询问”以获取有关这方面的提示。
1赞 wjandrea 9/17/2023
此外,是一个错误的变量名称,因为它隐藏了内置列表类型。在示例代码中,这不是一个大问题,但它令人困惑,因此最好使用更具描述性的名称,例如,例如,或至少像 .为什么“example = list(...)”会导致“TypeError: 'list' object is not callable”?listnumberslst
0赞 wjandrea 9/17/2023
我继续为您做了这件事,因为我也注意到了一些其他问题。如果它不符合您的喜好,您当然可以自己编辑它。

答:

2赞 wjandrea 9/17/2023 #1

如果您阅读切片的语法,proper_slice中的冒号 () 只是一个语法元素,而不是运算符或类似的东西。因此,它不能用于其他表达式(即本例中的条件表达式)。:

相反,我建议移动条件表达式并使用解包,如下所示:

start, end = (i, index) if i < index else (index, i)
print(lst[start:end])

另一种选择是保持相同的结构并使用 slice,这会创建一个与 slicing 语法等效的对象:

print(lst[slice(i, index) if i < index else slice(index, i)])

同样,您可以在此处使用解包以避免重复名称:slice

print(lst[slice(*(i, index) if i < index else (index, i))])
0赞 Janilson 9/17/2023 #2

原因是这是不允许在任何地方使用的特殊语法。如果你试图写一行,你也会得到一个错误。a:bslice_variable = (1:5)

归根结底,语法只是创建切片对象的语法糖。在不允许使用此缩短语法的上下文中,只需将其替换为 。start:end:stepslice(start, end, step)

在你的情况下,这将是:

for i in range(len(lst)+1):
    print(lst[slice(i,index) if i<index else slice(index,i)])
0赞 Andrej Kesely 9/17/2023 #3

查看您的代码,您可以这样编写循环(使用):min()/max()

for i in range(len(lst) + 1):
    print(lst[min(i, index) : max(i, index)])

指纹:

[1, 2]
[2]
[]
[3]
[3, 4]
[3, 4, 5]
[3, 4, 5, 6]