从硬币和数量创建平面列表

时间:2018-03-15 18:23:54

标签: python python-3.x list-comprehension

我有一个带硬币的数组,例如(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中解决这个问题,而不是创建列表列表然后展平它?

4 个答案:

答案 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])