【问题标题】:Rewrite this loop function with range用范围重写这个循环函数
【发布时间】:2010-11-15 15:39:22
【问题描述】:

是否可以重写这个循环:

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

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

谢谢。

【问题讨论】:

  • 它是一系列 matplotlib 对象。每个控制较大图表的一个子图。
  • 除非你在某种迭代中拥有所有aa等,否则没有办法让它更短。
  • 见@Space_C0wb0y...对象是可迭代的(例如列表)吗?如果是,这很容易 - 否则几乎是不可能的。
  • 顺便说一句,有不到 220 个元素。 26*4=104
  • @jon_darkstar:你是对的。我的错。

标签: python loops for-loop range


【解决方案1】:

如果你有一个列表中的对象其实很简单:

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

所以你应该想办法把它们放在一个列表中。

【讨论】:

    【解决方案2】:

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

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

    话虽如此,根据变量的名称,看起来您有一个值矩阵。如果是这种情况,使用这种结构并只迭代两个索引而不是使用大量命名变量会更有意义。

    【讨论】:

    • 每当你在 Python 中编写 [x]range(len(...)) 时,要么有非常奇怪的需求,要么没有正确使用迭代器。
    • 好点,它有点适合 26x4 的桌子。我的回答中没有考虑到这一点。
    【解决方案3】:

    假设您将这些 matplotlib 放在一个可迭代对象中,objs:

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

    如果您使用 2 元组而不是长度为 2 的列表,这可以变得更短和更简单(无论如何您可能都想要这个!):enumerate(objs, 1)

    【讨论】:

    • 因为他无论如何都会遍历它们 (for k, n in ...),您甚至不必将其列为列表。
    • @Space_C0wb0y:是的,谢谢你的提示——把它变成了一个生成器。
    【解决方案4】:

    如果所有这些对象都在模块全局命名空间中,您可以执行以下操作:

    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()

    【讨论】:

    • 与@pyfunc 相同:是什么让您认为 OP 想要字符串?
    【解决方案5】:

    试试这些。

    [[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 要么在全局命名空间中,要么(希望)是一个字典?只需将 eval() 或 dict 名称放在 c1+c2 周围

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

    【讨论】:

      【解决方案6】:

      一种天真的方法:

      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 做同样的事情。

      【讨论】:

      • 我看到每个人都喜欢“枚举”
      • string.ascii_lowercase, itertools.permutations。了解您的标准库。
      • 别那么冒犯。 string.asccii_lowercase 不能使用,直到我们不知道必须用于生成他的范围的语料库。事实上,我们可以用 itertools.permutations 替换我的 xcombinations。
      猜你喜欢
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多