Умножить список значений RGB Python - PullRequest
2 голосов
/ 08 февраля 2020

Я пытаюсь умножить список значений 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)] 

Но вывод I получаю

[(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 количество раз.

Кто-нибудь знает, как решить проблему?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2020

вы можете использовать список и встроенную функцию zip, соединяясь с zip каждым элементом из colors с каждым числом из multipliers в один для l oop, затем в секунду для l oop вы говорите, сколько раз текущий цвет должен повторяться

[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 для циклов, с одним l oop, который вы повторяете для каждой пары (цвет, множитель), а во втором / внутреннем l oop вы повторяете текущий цвет с текущим множителем и , расширяющим 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)]
1 голос
/ 08 февраля 2020

Одно возможное решение с использованием 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 для повторения по одному. Таким образом, результат map будет

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

Теперь мы используем chain.from_iterable для получения значений из каждой итерации, повторяемой из map.

...