0

listtwo (実際には、r、g、b の色ごとに 1 つの 3 つのリスト) のカラーコード項目を別の単語のリストに適用しようとしています....問題は、色よりも多くの単語があることです。終了したらカラーコードを再開するにはどうすればよいですか?

ここまで私のコードと試み...

言葉のリスト....

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 - 最初の 4 つの単語だけが色を受け取り、残りの単語には何も起こりません。

私のコードは次のようになると思っていました....

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

ご覧のとおり、言葉が終わるまで、最後に到達するたびに色を最初から開始したかったのです...

私は何を間違っていますか?

ありがとう...

4

2 に答える 2

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") 演算子を使用すると*、シーケンスを関数の引数にアンパックできます。

ここで、すべての単語をすべての色で表示したい場合は、次のように product を使用できます。

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))]
于 2013-09-18T16:12:35.583 に答える
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
于 2013-09-18T16:10:55.483 に答える