我正在尝试将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
函数将应用colors
和multipliers
中的值以逐个重复。因此,地图的结果将是
list(map(repeat, x, y))
[repeat((70, 76, 75), 2), repeat((97, 107, 93), 3)]
现在,我们使用chain.from_iterable
来使用来自 map 返回的可迭代对象中的每个可迭代对象的值。