Python 元组:干净地删除前三个元素

Python Tuples: remove the first three elements cleanly

我的问题:

chop_first_three = lambda t: t[3:]
chop_first_three((1, 2, 3, 4, 5))  # (4, 5) correct
chop_first_three(('abc', 7, 8, 9)) # (9,)   ??? why not (9)?

回答

简单的答案是,括号对于分组和元组而言是超载的。为了在 python 中区分这些形式,尾随的逗号明确表示一个元组。

下面的几个答案和评论指出了这一点。

我把我原来的问题留在上面所以下面的答案是有道理的,但显然,我原来的一些问题是不正确的。

没有逗号的圆括号用于分组操作,所以 (9) 只是一种奇怪的说法 9.

这里看起来很奇怪,但是对于像(4 + 5) * 6:

这样合理的事情来说很重要
  • 如果没有括号,PEMDAS 将首先计算 5 * 6,您会得到错误的答案(34 而不是 54)。
  • 使用括号,如果不需要逗号作为 tuple,则计算结果为包含 9 的一个 tuple,该序列乘法将展开(9, 9, 9, 9, 9, 9),又不是你想要的。

所以特别是对于 one-tuple 的情况,尾随的逗号表示“我正在做一个 tuple,而不仅仅是分组操作”。您可以在任何 tuple 中包含一个尾随逗号,但它对于一个 tuples.

是强制性的

简而言之,您看到的结果是正确的。如果您真的讨厌结尾的逗号,您可以手动设置 tuple 的格式,以便在 print/stringify 时不包含它们。例如,给定一个可能只有一个元素的 tuple,您可以这样做:

maybe_one_tuple = ...
comma_sep = ', '.join(map(str, maybe_one_tuple))
with_parens = f'({comma_sep})'
print(with_parens)

或者使用 list 的字符串化形式来减少您需要自己完成的自定义工作的俗气技巧:

list_str_form = str(list(maybe_one_tuple))
with_parens = f'({list_str_form[1:-1]})'

仅转换为 list,将 list 字符串化(与 tuple 的字符串形式相同,只是使用 [] 而不是 (),并且长度为 1 lists) 不需要尾随逗号),手动删除保证存在的 [],并用 () 替换它们。

在 python 中,如果您将对象括在括号中,您只会取回该元素。

a = (9)
print(type(a)) # <class 'int'>

(9,) 是一个只包含一个元素(数字 9)的元组

a = (9,)
print(type(a)) # <class 'tuple'>

当你切片一个元组时,你总是会得到一个元组(即使它只包含一个元素)因此 (9,)

Python 元组是不可变的,因此,您不能更改元组中的任何项目。

如果要更改元组项,则将元组转换为列表,然后修改并更改为元组..

谢谢。

这是我的第一条评论