Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python元组中定义重复项?_Python_Python 3.x_Indexing_Tuples - Fatal编程技术网

如何在Python元组中定义重复项?

如何在Python元组中定义重复项?,python,python-3.x,indexing,tuples,Python,Python 3.x,Indexing,Tuples,在已知每个项的出现次数的情况下,定义由整数组成的元组有哪些好方法 比如说, 我想定义一个元组,其中3个2,2个4,1个3,5出现一次 为此,我始终可以采用手动方式: foo = (1, 2, 2, 2, 3, 4, 4, 5) 但是,当列表中的项目数量很大时,这会变得有点混乱。 因此,我想知道有哪些方法可以自动生成每个项目所需数量的副本。类似的方法可以工作: >>> result = tuple() >>> for item, repeat in ((1,

在已知每个项的出现次数的情况下,定义由整数组成的元组有哪些好方法

比如说,

我想定义一个元组,其中3个2,2个4,1个3,5出现一次

为此,我始终可以采用手动方式:

foo = (1, 2, 2, 2, 3, 4, 4, 5)
但是,当列表中的项目数量很大时,这会变得有点混乱。
因此,我想知道有哪些方法可以自动生成每个项目所需数量的副本。

类似的方法可以工作:

>>> result = tuple()
>>> for item, repeat in ((1, 1), (2, 3), (3, 1), (4, 2), (5, 1)):
...    result = result + (item,) * repeat
>>> result
(1, 2, 2, 2, 3, 4, 4, 5)

您可以这样做:

>>> (1,) * 1 + (2,) * 3 + (4,) * 2 + (5,) * 1
(1, 2, 2, 2, 4, 4, 5)

一种方法是使用序列乘法。下面是一个简单的版本,它不试图避免创建不必要的中间对象:

accumulator = ()
for (val, count) in some_data_structure:
    accumulator += (val,) * count

这是可以改进的,重点是演示
(1,)*5
为您提供
(1,1,1,1)
。请注意,这复制了对象引用-这对于整数来说很好,但如果您试图将可变对象序列相乘,则可能会导致混淆。

如果您有一个表示值和频率的元组,则可以执行以下操作:

tuples = ((1,1), (2,3), (3,1), (4,2), (5,1))

tuple(i for i, n in tuples for _ in range(n)) # Use xrange in Python 2.X
# (1, 2, 2, 2, 3, 4, 4, 5)
或者,如果您知道值总是为1、2、3、…、n,则可以使用频率元组的
enumerate

freqs = (1, 3, 1, 2, 1)

tuple(i for i, n in enumerate(freqs, 1) for _ in range(n))
# (1, 2, 2, 2, 3, 4, 4, 5)

如果您对生成器表达式中双重理解的用法感到好奇,您可能需要查看。

因此您需要
集合的反函数。Counter
。这是你可以做到的

# make a dict of counts (list of tuples is better)
counts = {1: 1, 2: 3, 4: 2, 3:1, 5: 1}
t = tuple(k for k,v in sorted(counts.items()) for _ in range(v))
(1, 2, 2, 2, 3, 4, 4, 5)
# for k,v in list_of_tuples, for a list of tuples

您可以定义以下函数

def a_tuple(*data):
    l = []
    for i, cnt in data: l.extend([i]*cnt)
    return tuple(l)
像这样使用它

print(a_tuple((1,1), (2,3), (3,1), (4,2), (5,1)))
生成以下输出

(1, 2, 2, 2, 3, 4, 4, 5)

如果您不了解该函数是如何工作的,请查看。如果元组中的数字不多,可以用最简单的方法执行

(1,)+(2,)*3+(3,)+(4,)*2+(5,)
否则,只需将其转换为函数

def myTuple(*val):
    return sum(((i,) * n for i, n in val), ())

myTuple((1,1),(2,3),(3,1),(4,2),(5,1))
>>>(1, 2, 2, 2, 3, 4, 4, 5)
您也可以通过以下方式调用它:

val = ((1,1),(2,3),(3,1),(4,2),(5,1))
myTuple(*val)
>>>(1, 2, 2, 2, 3, 4, 4, 5)

如何确定重复次数?它们是事先知道的。我已经在问题本身中说明了这一点。你也暗示了项目的数量可能会发生变化。我不是落选者,但也许对正在发生的事情做一点解释会有所帮助?这与我在回答中的想法基本相同,只是做了我提到的改进之一,以避免创建一些不必要的中间元组。
sum(…,[])
的复杂度是二次的。—很公平,它确实概括了这个问题。嵌套的生成器应该避免额外的复杂性。我将删除
sum
方法。