2013-09-18 2 views
0

Я пытаюсь применить элементы colourcodes из listtwo (фактически его три списка по одному для каждого цвета, r, g, b) в другой список слов. ... Проблема в том, что есть больше слов, чем есть цвета. Как я могу вернуть цветовые коды после завершения?Python: Итерация через listone, итерация через listtwo и применение элементов from listtwo к listone

Heres мой код и пытаться до сих пор ...

список слов ....

listone = ["Apple","Toyota","Civic","Merc","Toshiba","Samsung","Dell","Turbo"] 

списки цветов

r = [135,147,196,211] 
g = [193,208,229,117] 
b = [196,35,135,3] 

zippedrgb = zip(r,g,b) 

for i, word in enumerate(listone): 
    p=0 
    y=0 
    for x, colour in enumerate(zippedrgb): 
     Shape.TextFrame.TextRange.Characters(res[p], charlen[y]).Font.Color = RGB(r[x],g[x],b[x]) 
     p+=1 
     y+=1 

Что происходит, когда я запускаю этот код:

из списка слов - listone - только первые четыре слова получают цвет, ничего не происходит с оставшиеся слова.

Я ожидал, что мой код будет сделать следующее ....

word[1] = RGB(135,193,196) 
word[2] = RGB(147,208,35) 
word[3] = RGB(196,229,135) 
word[4] = RGB(211,117,35) 
word[5] = RGB(135,193,196) 
word[6] = RGB(147,208,35) 
word[7] = RGB(196,229,135) 
and so on untill the words finished 

Как вы можете видеть, я хотел цветов, чтобы начать с начинающимся каждый раз он достиг конца, пока слова не закончило. ..

Что я делаю неправильно?

Благодаря ...

+0

выглядит как работа для itertools! – rlms

ответ

3

Как получить цветные коды для перезагрузки, когда он подходит к концу?

itertools.cycle на помощь:

import itertools 

r = [135,147,196,211] 
g = [193,208,229,117] 
b = [196,35,135,3] 
listone = ["Apple","Toyota","Civic","Merc","Toshiba","Samsung","Dell","Turbo"] 
colours = zip(r,g,b) 

colours_and_names = zip(listone,itertools.cycle(colours)) 
#=> [('Apple', (135, 193, 196)), ('Toyota', (147, 208, 35)), ('Civic', (196, 229, 135)), ('Merc', (211, 117, 3)), ('Toshiba', (135, 193, 196)), ('Samsung', (147, 208, 35)), ('Dell', (196, 229, 135)), ('Turbo', (211, 117, 3))] 

Теперь давайте исправим ваш код немного:

for (i, (word,colour)) in enumerate(colours_and_names): 
    Shape.TextFrame.TextRange.Characters(res[i], charlen[i]).Font.Color = RGB(*colour) 

Вы можете видеть, что с назначением последовательности, вы можете перечислить через заархивированную структуру , и захватить элементы в переменные; и оператор * («splat») позволяет распаковать последовательность в аргументы функции.

Теперь, если вы хотите каждое слово в любом цвете, вы можете использовать продукт:

list(itertools.product(listone,colours)) 
#=> [('Apple', (135, 193, 196)), ('Apple', (147, 208, 35)), ('Apple', (196, 229, 135)), ('Apple', (211, 117, 3)), ('Toyota', (135, 193, 196)), ('Toyota', (147, 208, 35)), ('Toyota', (196, 229, 135)), ('Toyota', (211, 117, 3)), ('Civic', (135, 193, 196)), ('Civic', (147, 208, 35)), ('Civic', (196, 229, 135)), ('Civic', (211, 117, 3)), ('Merc', (135, 193, 196)), ('Merc', (147, 208, 35)), ('Merc', (196, 229, 135)), ('Merc', (211, 117, 3)), ('Toshiba', (135, 193, 196)), ('Toshiba', (147, 208, 35)), ('Toshiba', (196, 229, 135)), ('Toshiba', (211, 117, 3)), ('Samsung', (135, 193, 196)), ('Samsung', (147, 208, 35)), ('Samsung', (196, 229, 135)), ('Samsung', (211, 117, 3)), ('Dell', (135, 193, 196)), ('Dell', (147, 208, 35)), ('Dell', (196, 229, 135)), ('Dell', (211, 117, 3)), ('Turbo', (135, 193, 196)), ('Turbo', (147, 208, 35)), ('Turbo', (196, 229, 135)), ('Turbo', (211, 117, 3))] 
+0

большое спасибо. Это именно то, что я искал, и спасибо за дополнительную помощь в моем коде! im новое для python, и это действительно помогает! –

+0

@ Boosted_d16 Добро пожаловать! Поскольку в вашем коде отсутствуют 'res' и' charlen', я не могу гарантировать, что исправленная версия будет делать то же самое, но, надеюсь, это поможет. Похоже, вы на пути к работе легко и эффективно с python, так что удачи! – Marcin

+0

Просто протестирован с использованием вашего исправленного кода и он отлично работает. Это именно то, что я хотел. Еще раз спасибо! –

1
from itertools import cycle 
list1 = ["Apple","Toyota","Civic","Merc","Toshiba","Samsung","Dell","Turbo"] 
list2 = ["Blue","Red"] 
print zip(list1,cycle(list2)) 

или чуть более старомодный

items = [] 
for i in range(len(list1)): 
    items.append((list1[i],list2[i%len(list2)])) 
print items 
+0

Спасибо, Джоран, спасибо! –

Смежные вопросы