2010-11-15 48 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