如何在元组中将元素复制 n 次

4

我想要一个由n个元组组成的元组,但不知道如何实现。

从这个 ([1, 25, 30], 'a') 开始,我尝试了这个 ([1, 25, 30], 'a')*3 但它并不起作用。

基本上我想得到这样的反馈:

Out[29]: 
(([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'))
3个回答

3

在“乘法”之前,您必须将元组包装到另一个仅包含一个元素的元组中:

>>> ([1, 25, 30], 'a') * 3
([1, 25, 30], 'a', [1, 25, 30], 'a', [1, 25, 30], 'a')
>>> (([1, 25, 30], 'a'),) * 3
(([1, 25, 30], 'a'), ([1, 25, 30], 'a'), ([1, 25, 30], 'a'))

请注意,这将创建一个包含 3 个指向 同一 元组的引用的元组。对于纯粹不可修改的元组而言,这是可以接受的,但由于您的元组具有可变部分,如果修改了其中一个引用,所有“不同”的引用都会被修改。

>>> t = (([1, 25, 30], 'a'),) * 3
>>> t[0][0][1] = 42
>>> t
(([1, 42, 30], 'a'), ([1, 42, 30], 'a'), ([1, 42, 30], 'a'))

如果您不想要这个,最好使用带有生成器表达式的元组(tuple):

>>> t = tuple( ([1, 25, 30], 'a') for _ in range(3))
>>> t[0][0][1] = 42
>>> t
(([1, 42, 30], 'a'), ([1, 25, 30], 'a'), ([1, 25, 30], 'a'))

1
外面的括号只是分组括号。您需要添加逗号使外层封闭成为元组:
t = (([1, 25, 30], 'a'),) * 3
print(t)

# Output
# (([1, 25, 30], 'a'), ([1, 25, 30], 'a'), ([1, 25, 30], 'a'))

1
import pprint
tt = (([1, 25, 30], 'a'),)*8
pprint.pprint(tt)

输出:

(([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'),
 ([1, 25, 30], 'a'))

但要记住,这些都是对同一对象的引用!

tt[0][0][0] = 2 # this will change the first list item in all tuples!
pprint.pprint(tt)

输出:

(([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'),
 ([2, 25, 30], 'a'))

请参见:子列表中反映的列表更改列表


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