当其他值未使用时从元组中提取a值

时间:2011-02-25 20:02:36

标签: python

我有一个元组foo,其中包含我不关心的内容和我所做的事情。

foo = (something_i_dont_need, something_i_need)

使用

更正确
_, x = foo

x = foo[1]

如果foo不是长度为2,我唯一能想到的就是不同的行为。 我认为这是相当具体的案例,但这是事实上的pythonic做事方式之一吗?

6 个答案:

答案 0 :(得分:11)

我使用_十多年了。它更具可读性,尤其是在提取多个值时:

  _, _, name, _, _, city, _ = whatever

即使只有一个变量,另一种方式是强迫人类读者在他们想要真正理解代码的情况下进行计数,更可能的是他们的眼睛只是要通过它。

使用下划线,您可以更好地利用人脑的模式匹配能力。可能是一件小事,但在调试时每一点都有帮助。 :)

答案 1 :(得分:8)

我认为通常的做法是

x=foo[index]

使用_不太常见,我认为也不鼓励。如果您只需要长_ / tuple中的一些元素,则使用list也很难处理。当你只选择一个连续的子序列时,切片也很方便。

但在一天结束时,我认为这只是主观偏好的问题。使用对您和您的团队来说更具可读性的任何内容。

答案 2 :(得分:2)

两者都是可以接受的,我在生产代码中都看到过。我认为选择背景,意图和当地风格。

还有第三个选项,代码描述了未使用的值:

_real, imaginary = foo

我在代码中使用全部三个,具体取决于哪个最清楚:

_, x = foo

  • 当元组很小时。
  • 当丢弃的值很少时。
  • 当相对于提取值的数量丢弃的值很少时。
  • 读者可能知道元组的构成,整个元组的构成很重要。
  • 习惯上将元组的结构视为一个单元

x=foo[i]

  • 当元组很大时。
  • 当许多废弃值存在许多值时。
  • 当读者可能知道元组的构成时。
  • 其余的元组值完全无关紧要。没有为读者提供有用的信息。
  • 习惯上将结构视为序列。
  • 当元组具有均匀的组成时。
  • 当习惯使用数据类型的索引时。
  • 当索引键入循环时。
  • 读者应注意索引的价值。

_real, imaginary = foo

  • 当元组很小时。
  • 当丢弃的值很少时。
  • 当读者可能不知道元组的构成时。
  • 命名丢弃的值时,会让读者深入了解。 (您可以从这一行猜出foo是一个复数。)

答案 3 :(得分:1)

如果这是函数或方法的返回值,另一种方法是编写一个包装器函数(或类的子类并添加一个方法),它只返回你感兴趣的项目,然后调用它。 / p>

答案 4 :(得分:1)

另一种可能性是创建一个命名元组并在您的返回值中使用它。然后你就可以通过“name”访问你想要的值。

MyTuple = collections.namedtuple('MyTuple', 'ignored needed')

然后你可以制作

foo = (something_i_dont_need, something_i_need)

进入

foo = MyTuple(something_i_dont_need, something_i_need)

然后说

x = foo.needed

代替

x = foo[1]

性能方面,这可能不是最好的。但我认为它有时可以使编写和理解代码更容易。它是其他一些解决方案的替代方案。

答案 5 :(得分:0)

第一种情况:foo需要两个变量unpack(元组长度为2)。 _完全可以。

第二种情况:给你index value(切片)