在Python中创建多项元组n次

16

可以创建n次列表:

a = [['x', 'y']]*3 # Output = [['x', 'y'], ['x', 'y'], ['x', 'y']]

但我想以这样的方式创建一个元组,但它不能像列表那样返回相似的结果。我正在执行以下操作:

a = (('x','y'))*4 # Output = ('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
Expected_output = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

有什么建议吗?谢谢。

2个回答

30

外层括号只是分组用的括号。你需要添加逗号才能使外层封装成元组:

a = (('x','y'),)*4
print(a)
# (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

为了更好地理解,例如在f =(x + y)的情况下,获得一个元组是没有意义的。


通常需要使用逗号来定义一个单元素元组:

a = (5)  # integer
a = (5,) # tuple
a = 5,   # tuple, parens are not compulsory

顺便提一句,跨越嵌套容器(nested containers)的重复项不仅需要简单的乘法操作。以您的第一个操作为例:

>>> a = [['x', 'y']]*3
>>> # modify first item
...
>>> a[0][0] = 'n'
>>> a
[['n', 'y'], ['n', 'y'], ['n', 'y']]

基本上没有第一项 - 父列表只包含一个在不同索引处重复的列表对象。对于元组来说,这可能并不是特别令人担忧,因为它们 不可变

考虑使用更正确的方法:

>>> a = [['x', 'y'] for _ in range(3)]
>>> a[0][0] = 'n'
>>> a
[['n', 'y'], ['x', 'y'], ['x', 'y']]

谢谢。但是这个小差异的原因是什么? - muazfaiz
1
这是为了区分作为括号使用的闭合大括号(例如(5) => 5)和表示元组的闭合大括号。 - Rohin Gopalakrishnan
1
请注意,最终结果是一个包含四个对同一元组的引用的元组(id(a[0]) == id(a[1]) 的值为 True)。元组是不可变的,所以这并不重要,但如果你在元组中有四个相同的列表并修改其中一个,结果可能会令人惊讶。 - Steven Rumbalski
@StevenRumbalski 我会在注释中特别提到列表部分。很好你注意到了。 - Moses Koledoye

0
这只是对主要答案的一个小改动。我只是需要更具体地了解我的情况而已。

NNone的元组

对于任何想要获得一个由N个None或其他简单值组成的元组,以初始化一些元组变量的人来说,代码如下:

N = 3
# Create `(None, None, None)`
tuple_of_nones = (None,) * N  

# Create `(3, 3, 3, 3, 3)`
tuple_of_five_threes = (3,) * 5

# etc.

在解释器中运行的示例和输出:
>>> N = 3
>>> tuple_of_nones = (None,) * N
>>> tuple_of_nones
(None, None, None)

>>> tuple_of_five_threes = (3,) * 5
>>> tuple_of_five_threes
(3, 3, 3, 3, 3)

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