Для всех "есть ли более быстрый способ сделать это" вопросы в python (и, я полагаю, в большинстве языков), ответ: измерьте его, тогда вы будете знать .
Я взял код в ответах, предложенных до сих пор, и рассчитал его время:
import numpy as np
import timeit
n = 7
l = [('red', [0,2,5]),
('yellow', [1,4]),
('red', [6])]
def OP_approach():
result = ['white'] * n
for t in l:
for i in t[1]:
result[i] = t[0]
return result
def yatu_approach():
d = {j:i[0] for i in l for j in i[1]}
return [d.get(i, 'white') for i in range(len(d)+1)]
def blue_note_approach():
x = np.empty(7, dtype='<U5')
x.fill('white')
for a, b in l:
x[b] = a
return x
timeit.timeit(OP_approach, number=10000)
timeit.timeit(yatu_approach, number=10000)
timeit.timeit(blue_note_approach, number=10000)
К моему удивлению, это результат на моей машине (плате arm64):
>>> timeit.timeit(OP_approach, number=10000)
0.033418309001717716
>>> timeit.timeit(yatu_approach, number=10000)
0.10994336503790691
>>> timeit.timeit(blue_note_approach, number=10000)
0.3608954470255412
Похоже, что для данных выборки простой двойной цикл выполняется быстрее, чем оба других варианта.Имейте в виду, однако, что, как отмечает @yatu, эти алгоритмы масштабируются очень по-разному, и выбор того, что использовать, зависит от ожидаемого размера решаемой проблемы.