用范围重写这个循环函数

时间:2010-11-15 15:39:23

标签: python loops for-loop range

是否可以重写此循环:

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]]:

有两个范围函数还是“列表乘法”?我尝试了各种各样的方法,但到目前为止都没有。

谢谢。

6 个答案:

答案 0 :(得分:4)

如果列表中的对象实际上非常简单:

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

所以你应该找一种方法把它们放在一个列表中。

答案 1 :(得分: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()

答案 2 :(得分:0)

你没有提供太多信息,所以这可能不是你想要的,但是:

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

话虽如此,基于变量的名称,看起来你有一个值矩阵。如果是这种情况,那么使用这种结构更有意义,只需迭代两个索引而不是拥有大量命名变量。

答案 3 :(得分:0)

假设您在可迭代的objs

中有这些matplotlib
([i, obj] for i, obj in enumerate(objs, 1))

如果您使用2元组而不是长度为2的列表(无论如何您仍然希望这样做),这可以变得更短更简单。:enumerate(objs, 1)

答案 4 :(得分: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替换。

答案 5 :(得分:0)

尝试这些。

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

[j,i]只是按照你说的顺序打印。把功能或任何你想要的东西放在那里 或者如果你更喜欢循环到list-comp

for i,j in enumerate([c1+c2 for c1 in ascii_lowercase for c2 in ascii_lowercase[0:4]]):
    #loop body
猜测aa到zd要么在全局命名空间中,要么(希望是)dict?只需在c1 + c2周围放置eval()或dict名称

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