忽略Python元组的一部分

83
如果我有一个元组,例如(1,2,3,4),我想将1和3分别赋值给变量a和b,我可以很明显地说:
myTuple = (1,2,3,4)
a = myTuple[0]
b = myTuple[2]

或者像这样

(a,_,b,_) = myTuple

我是否能够解包这些值,但忽略其中一个或多个值?


3
a, _, b = myTuple 是一个相当常见的习惯用语。实话说,我并没有发现什么问题。 - NPE
在使用“_ == 2”会遇到什么问题?在代码中,“_”之后将不再被使用。 - Rik Poggi
1
如果我想忽略元组的两个部分怎么办?我将更新问题。 - Jim Jeffries
2
@Rik ...除非他们使用gettext库。 - Lauritz V. Thaulow
4个回答

87

我个人会这样写:

a, _, b = myTuple

这是一个相当常见的习语,因此广为人知。我认为语法非常清晰。


10
我想指出,在Python解释器中,下划线符号“_”被赋值为上一个表达式的结果(因此,如果您键入“'hi'”并按Enter键,那么“_”将是“hi”),直到您执行像这样的操作并将一个值分配给它,然后它将不再像以前那样工作。 - 2rs2ts
5
为了完整性,需要补充说明:当您本地分配的变量“_”离开作用域时,它将再次像通常一样工作,例如,当封闭函数结束时。要在程序的特定点强制发生这种情况,可以使用“del _”;这会显式删除您本地定义的变量“_”,从而揭示全局值“_”。 - CrepeGoat

24

你可以使用*_来捕获未知数量的元素,例如:

first, *_, one_before_last, _ = 1,2,3,4,5,6,7,8,9

提供:

第一个数字为1
倒数第二个数字为8


正确,但我想澄清这仅适用于Python3。 - Ataxias
6
只有 Python 3。 - o17t H1H' S'k
1
你上面的陈述显然是错误的。无论我们喜欢与否,存在着使用Python2的大量遗留代码,了解什么是向后兼容的以及什么不是将会很有帮助(这就是为什么IDE提供这些信息的原因)。 - Ataxias

20

在我看来,您的解决方案很好。如果您真的对分配 _ 有问题,那么您可以定义一个索引列表并执行以下操作:

a = (1, 2, 3, 4, 5)
idxs = [0, 3, 4]
a1, b1, c1 = (a[i] for i in idxs)

7
请注意,您可以像这样切片源元组:
a,b = some_tuple[0:2]

1
太好了!如果有多个条目,可以这样简单地完成: a,b = myTuple[0], myTuple[3] - Uriel Alves

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