乘以 RGB 值列表 Python



我正在尝试将RGB值列表相乘,更具体地说,将每个元素与不同的变量相乘 例如

colors = [(70, 76, 75), (97, 107, 93)]
multipliers = [2,3]
prod = lambda a,b: [a[i]*b[i] for i in range(len(a))]
newcolors = (prod (colors, multipliers))

期望输出:

[(70,76,75), (70,76,75), (97, 107, 93), (97, 107, 93), (97, 107, 93)] 

但是我得到的输出是

[(70,76,75, 70,76,75), (97, 107, 93, 97, 107, 93,97, 107, 93)]

返回的列表不再包含 RGB 值

似乎有效的是

n = 2
newcolors = sorted(colors*n)

输出:

[(70,76,75), (70,76,75), (97, 107, 93), (97, 107, 93)]

但这样,所有 RGB 值都会乘以相同的n次数。

有人知道如何解决问题吗?

您可以使用列表推导和内置函数zip,与colors中的每个元素zip配对,将multipliers中的每个数字配对在一个for循环中,然后在第二个for循环中,您说当前颜色应该重复多少次

[e for e, m in zip(colors, multipliers) for _ in range(m)]

输出:

[(70, 76, 75), (70, 76, 75), (97, 107, 93), (97, 107, 93), (97, 107, 93)]

您也可以使用 2 for 循环,一个循环遍历每对(颜色、乘数(,在第二个/内部循环中,您将使用当前乘数重复当前颜色并扩展result列表:

result = []
for e, m in zip(colors, multipliers):
result.extend([e] * m)
print(result)

输出:

[(70, 76, 75), (70, 76, 75), (97, 107, 93), (97, 107, 93), (97, 107, 93)]

使用迭代工具的一种可能的解决方案:

import itertools
colors = [(70, 76, 75), (97, 107, 93)]
multipliers = [2,3]
print(list(itertools.chain.from_iterable(map(itertools.repeat, colors, multipliers))))

输出:

[(70, 76, 75), (70, 76, 75), (97, 107, 93), (97, 107, 93), (97, 107, 93)]

解释:

在这里,map函数将应用colorsmultipliers中的值以逐个重复。因此,地图的结果将是

list(map(repeat, x, y))
[repeat((70, 76, 75), 2), repeat((97, 107, 93), 3)]

现在,我们使用chain.from_iterable来使用来自 map 返回的可迭代对象中的每个可迭代对象的值。

最新更新