Python 元组:干净地删除前三个元素
Python Tuples: remove the first three elements cleanly
我的问题:
(9,)
与 (9)
有何不同? (9,)==(9)
产量 False
- 为什么
(9,)
出现在下面的代码段中?
- 如何修复下面的代码,以便获得
(9)
?
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
中包含一个尾随逗号,但它对于一个 tuple
s.
是强制性的
简而言之,您看到的结果是正确的。如果您真的讨厌结尾的逗号,您可以手动设置 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 list
s) 不需要尾随逗号),手动删除保证存在的 [
和 ]
,并用 (
和 )
替换它们。
在 python 中,如果您将对象括在括号中,您只会取回该元素。
a = (9)
print(type(a)) # <class 'int'>
(9,)
是一个只包含一个元素(数字 9)的元组
a = (9,)
print(type(a)) # <class 'tuple'>
当你切片一个元组时,你总是会得到一个元组(即使它只包含一个元素)因此 (9,)
Python 元组是不可变的,因此,您不能更改元组中的任何项目。
如果要更改元组项,则将元组转换为列表,然后修改并更改为元组..
谢谢。
这是我的第一条评论
我的问题:
(9,)
与(9)
有何不同?(9,)==(9)
产量False
- 为什么
(9,)
出现在下面的代码段中? - 如何修复下面的代码,以便获得
(9)
?
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
中包含一个尾随逗号,但它对于一个 tuple
s.
简而言之,您看到的结果是正确的。如果您真的讨厌结尾的逗号,您可以手动设置 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 list
s) 不需要尾随逗号),手动删除保证存在的 [
和 ]
,并用 (
和 )
替换它们。
在 python 中,如果您将对象括在括号中,您只会取回该元素。
a = (9)
print(type(a)) # <class 'int'>
(9,)
是一个只包含一个元素(数字 9)的元组
a = (9,)
print(type(a)) # <class 'tuple'>
当你切片一个元组时,你总是会得到一个元组(即使它只包含一个元素)因此 (9,)
Python 元组是不可变的,因此,您不能更改元组中的任何项目。
如果要更改元组项,则将元组转换为列表,然后修改并更改为元组..
谢谢。
这是我的第一条评论