我有一个带硬币的数组,例如(coins=[10, 50, 100]
)和每个硬币数量的数组(例如quantity=[1, 2, 1]
)。我想生成一个新列表l
,它显示我拥有的所有硬币(例如l=[10, 50, 50, 100]
)。
到目前为止,我有这个,这就是诀窍:
coins=[i for s in [b*[a] for a,b in zip(coins,quantity)] for i in s]
有没有更好的方法在python中解决这个问题,而不是创建列表列表然后展平它?
答案 0 :(得分:4)
您可以利用itertools链并重复:
from itertools import repeat,chain
coins=[10, 50, 100]
quantity=[1, 2, 1]
result = list(chain.from_iterable(map(repeat, coins, quantity))) # thx @ miradulo
print(result)
输出:
[10, 50, 50, 100]
优点:它不构建内部列表,然后将其展平,但会将值生成为迭代。
答案 1 :(得分:2)
假设最终订单不重要,您可以使用collections.Counter()
:
>>> from collections import Counter
>>> c = Counter(dict(zip(coins, quantity)))
>>> list(c.elements())
[10, 100, 50, 50]
>>> c
Counter({50: 2, 10: 1, 100: 1})
答案 2 :(得分:1)
您可以使用sum
将列表添加到一起:
L = sum(([c] * q for c, q in zip(coins, quantity)), [])
numpy
还有一个能够完全符合您需要的功能:
numpy.repeat(coins, quantity)
编辑:因为@Chris_Rands指出sum
对于长列表列表不是最佳的。它似乎是quantity=[100, 200, 100]
最快的解决方案,但quantity=[1000, 2000, 1000]
numpy
要快得多。两者都比OP解决方案更快。
答案 3 :(得分:0)
for i in range(len(quantity)):
for j in range(quantity[i]):
print(coins[i])