2010-11-15 49 views
0

這個循環功能是否有可能改寫這個循環:重寫與範圍

for k,n in [[aa,1],[ab,2], [ac,3], [ad,4], [ba,5], [bb,6], [bc,7], [bd,8], 
      [ca,9],[cb,10],[cc,12],[cd,13],[da,14],[db,15],[dc,16],[dd,17],...zd,220]]: 

兩個範圍的函數或「名單倍增」?我嘗試了各種方法,但都沒有工作到目前爲止。

謝謝。

+1

什麼是'aa','ab',...? – delnan 2010-11-15 15:41:59

+0

它是一系列matplotlib對象。每個控制較大圖表的一個子圖。 – relima 2010-11-15 15:46:32

+0

除非你有所有這些'aa'等,在某種可迭代的情況下,沒有辦法讓這個更短。 – 2010-11-15 15:48:27

回答

4

如果你有對象名單的其實很簡單:

object_list = [aa, ab, ... ] 
for n, k in enumerate(object_list, start=1): 
    ... 

所以,你應該尋找一種方法,把它們放在一個列表,而不是。

+0

非常好。謝謝。 – relima 2010-11-15 15:56:52

0

如果所有這些對象都在模塊全局命名空間,你可以做這樣的事情:

from string import ascii_lowercase 
n = 1 
for a in ascii_lowercase: 
    for b in ascii_lowercase[0:4]: 
     k = globals()[a+b] 
     n+=1 

如果他們在一個函數的名字空間,你可以嘗試的locals()代替globals()

+0

與@pyfunc相同:是什麼讓你認爲OP需要字符串? – 2010-11-15 15:50:36

+0

哦,哎呀,我誤讀了那部分。 – GWW 2010-11-15 15:51:25

0

你沒有給出很多信息,所以這可能不是你正在尋找的,但:

l = [aa, ab, ... ] 
for i in xrange(len(l)): 
    k = l[i] 
    n = i+1 
    //the rest of your code 

這就是說,基於第e變量名稱,它看起來像你有一個值矩陣。如果是這樣的話,那麼使用這種類型的結構會更有意義,並且只是迭代兩個索引而不是擁有大量的命名變量。

+0

每當你在Python中編寫'[x] range(len(...))'',你要麼有非常奇怪的要求,要麼你沒有正確使用迭代器。 – delnan 2010-11-15 15:55:55

+0

好點,這是一個26x4表尖叫。我沒有考慮到我的答案。 – 2010-11-15 16:17:11

0

假設你在一個迭代有這些matplotlib,objs

([i, obj] for i, obj in enumerate(objs, 1)) 

這可以做得更短,更簡單,如果你使用的2元組,而不是長度爲二列表(你propably想要這個反正!) :enumerate(objs, 1)

+0

無論如何,他反覆遍歷它們('for k,n in ...'),你甚至不需要把它列爲一個列表。 – 2010-11-15 15:55:26

+0

@ Space_C0wb0y:是的,謝謝你的提示 - 把它變成了一個發電機。 – delnan 2010-11-15 15:56:39

0

天真的方法:

alphabet = ['a','b','c','d','e',] # Continue to have a complete alphabet 

# Generator that returns every combination of a given alphabet with a given length 
def xcombinations(items, n): 
    if n==0: yield [] 
    else: 
     for i in xrange(len(items)): 
      for cc in xcombinations(items[:i]+items[i+1:],n-1): 
       yield [items[i]]+cc 



gen = xcombinations(alphabet, 2) 

for p,k in enumerate(gen): 
    print ["".join(k), p] 

編輯:

xcombinations可以通過itertools.permutations誰做同樣的事情來代替。

+0

我看到大家都喜歡'枚舉' – ohe 2010-11-15 16:02:27

+2

'string.ascii_lowercase','itertools.permutations'。瞭解你的標準庫。 – delnan 2010-11-15 16:05:46

+0

不要太冒犯。除非我們不知道必須用於產生範圍的語料庫,否則不能使用string.asccii_lowercase。的確,我們可以用itertools.permutations替換我的xcombinations。 – ohe 2010-11-16 07:09:53

0

試試這些。

[[j,i] for i,j in enumerate([c1+c2 for c1 in ascii_lowercase for c2 in ascii_lowercase[0:4]])] 

[j,i]只是按您說的順序打印。放置功能或任何你想要的。
或者如果你喜歡循環列出-COMP

for i,j in enumerate([c1+c2 for c1 in ascii_lowercase for c2 in ascii_lowercase[0:4]]): 
    #loop body 

即時猜測AA通ZD要麼在全局命名空間或(希望)的字典?只需在c1 + c2周圍放置eval()或字典名稱

for i,j in enumerate([dictname['c1+c2'] for c1 in ascii_lowercase for c2 in ascii_lowercase[0:4]]): 
    #loopbody