如何在Python元组中定义重复项?
在已知每个项的出现次数的情况下,定义由整数组成的元组有哪些好方法 比如说, 我想定义一个元组,其中3个2,2个4,1个3,5出现一次 为此,我始终可以采用手动方式:如何在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,
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
方法。