2010-10-19 54 views
2

雖然看起來很可怕,我沒有發現這樣做的更好/更有效的方式:建議寫這一小段代碼更優雅

ae = np.arange(0.0,1,0.05) 
aee = np.arange(0.3,1.01,0.345) 
aef = np.arange(0.3,1.01,0.345) 
random.shuffle(ae) 
random.shuffle(aee) 
random.shuffle(aef) 
for item_a in aee: 
    for item_b in ae: 
     for item_c in aef: 
      rlist.append(colorsys.hsv_to_rgb(item_b,item_a,item_c)) 

想法?

+0

而上述代碼的目的是生成一個半混洗的顏色值列表? – jball 2010-10-19 19:27:37

+0

是的。這是正確的,至少在這一部分。 – relima 2010-10-19 19:32:09

+1

有意義的變量名稱? – 2010-10-19 19:32:44

回答

4
import numpy as np 
import random 
import itertools 
import colorsys 
hue, saturation, value = np.arange(0.0,1,0.05), np.arange(0.3,1.01,0.345), np.arange(0.3,1.01,0.345) 
rlist= [colorsys.hsv_to_rgb(hue, saturation, value) for hue, saturation, value in 
     itertools.product(random.sample(hue,len(hue)), random.sample(saturation, len(saturation)), random.sample(value, len(value)))] 
print rlist 

編輯:random.sample從全人羣,以避免就地單獨洗牌

版本不itertools:

# without itertools 
import numpy as np 
import random 
from pprint import pprint 
import colorsys 
hues, saturations, values = np.arange(0.0,1,0.05), np.arange(0.3,1.01,0.345), np.arange(0.3,1.01,0.345) 
rlist= [colorsys.hsv_to_rgb(hue, saturation, value) 
     for hue in random.sample(hues,len(hues)) 
     for saturation in random.sample(saturations, len(saturations)) 
     for value in random.sample(values, len(values))] 
pprint(rlist) 

您還可以從文檔itertools.product的定義(我這樣做,在模塊調用在我的服務器it.py,並使用它,而不是itertools):

product = None 
from itertools import * 
if not product: 
    def product(*args, **kwds): 
     # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy 
     # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 
     pools = map(tuple, args) * kwds.get('repeat', 1) 
     result = [[]] 
     for pool in pools: 
      result = [x+[y] for x in result for y in pool] 
     for prod in result: 
      yield tuple(prod) 

我用itertools通常爲:

import itertools as it 

但在服務器它是由

import it 
+0

+1''itertools.product' – eumiro 2010-10-19 19:49:59

+0

不錯,但我不能在Python 2.4中使用itertools.product,但是謝謝。 – relima 2010-10-19 19:54:34

+0

eumiro的三個fors也是一樣的,只是不適用於itertools.product的可變數量的參數。我只是沒有看到它發佈之前,也認爲添加到代碼,使其可運行。 – 2010-10-19 20:19:47

4

如果你不想洗牌rlist,但最初的名單,那麼你可以嘗試把最後四行成一個列表理解:

rlist = [ colorsys.hsv_to_rgb(b, a, c) for c in aef for b in ae for a in aee ] 
1

換成你不需要重新洗牌的第一PLAC每個列表因爲你會做笛卡爾的產品...;

import itertools 
import colorsys 


hsv_iter = itertools.product(np.arange((0, 1, 0.05), 
          np.arange((0.3,1.01,0.345), 
          np.arange((0.3,1.01,0.345)) 

rlist = [colorsys.hsv_to_rgb(hue, lightness, saturation) 
     for hue, lightness, saturation in hsv_ite] 

# you can shuffle now the list if you want 
random.shuffle(rlist) 
+0

我無法在Python 2.4中使用itertools.product,但謝謝。 – relima 2010-10-19 20:17:47

+0

注意,這會導致比OP的原始代碼更多的混洗可能性。 – jball 2010-10-19 20:28:56

1

愚蠢oneliner:

rlist = [colorsys.hsv_to_rgb(b, a, c) for c in random.sample(aef,len(aef)) 
             for b in random.sample(ae,len(ae)) 
             for a in random.sample(aee,len(aee))] 

random.sample(x,len(x))(2.3新)是幾乎等同於random.shuffle(x),但它返回的列表,而不是None的隨機副本。

這可能比洗牌或其他任何事情都慢得多,而且你不保留隨機列表的副本(如果你在意的話)。