有哪些好方法可以定义由整数组成的元组,其中每个项目的出现次数是已知的?
例如,
我想定义一个元组,其中包含3个2,4个,1个,3个,5个,一次出现。
为此,我总是可以采用手动方式:
foo = (1, 2, 2, 2, 3, 4, 4, 5)
但是,当列表中的项目数量很大时,这会变得有点混乱。 所以,我想知道有什么方法可以自动完成生成每个项目所需数量的重复项的任务。
答案 0 :(得分:4)
你可以这样做:
>>> (1,) * 1 + (2,) * 3 + (4,) * 2 + (5,) * 1
(1, 2, 2, 2, 4, 4, 5)
答案 1 :(得分:2)
一种方法是使用序列乘法。这是一个简单的版本,它不会试图避免创建不必要的中间对象:
accumulator = ()
for (val, count) in some_data_structure:
accumulator += (val,) * count
可以改进,主要是要证明(1,) * 5
为您提供(1, 1, 1, 1, 1)
。请注意,这会复制对象引用 - 这对于整数来说很好,但是如果您尝试将一系列可变对象相乘,则会引起混淆。
答案 2 :(得分:2)
如果你有一个表示值和频率的元组元组,你可以执行以下操作:
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)
如果您对在生成器表达式中使用双重理解感到好奇,可能需要查看this question。
答案 3 :(得分:1)
如果您的元组数量不多,您可以用最简单的方式完成。
(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)
答案 4 :(得分:0)
这样的事情可行:
>>> 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)
答案 5 :(得分:0)
所以你想要collections.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
答案 6 :(得分:0)
您可以定义以下功能
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)
如果您不了解该功能的工作原理,请查看.extend()
method of list。