我正在尝试将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
数量。
有人知道如何解决该问题吗?
您可以使用list comprehension和内置函数zip
,将zip
中的每个元素与zip
中的每个数字与colors
配对,在一个for循环中,然后在第二个for循环中,说应该重复当前颜色多少次
multipliers
输出:
[e for e, m in zip(colors, multipliers) for _ in range(m)]
您还可以将2用于循环,其中一个循环遍历每对(颜色,乘数),在第二个/内部循环中,使用当前乘数重复当前颜色,并在[(70, 76, 75), (70, 76, 75), (97, 107, 93), (97, 107, 93), (97, 107, 93)]
列表中重复extending:
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)]
的一种可能的解决方案:
itertools
输出:
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)]
消耗map返回的可迭代对象中每个可迭代对象的值。