代码之家  ›  专栏  ›  技术社区  ›  Wayne Werner

在列表上迭代格式字符串

  •  10
  • Wayne Werner  · 技术社区  · 14 年前

    在Lisp中,您可以有如下内容:

    (setf my-stuff '(1 2 "Foo" 34 42 "Ni" 12 14 "Blue"))
    (format t "~{~d ~r ~s~%~}" my-stuff)
    

    在同一个列表上迭代的最蟒蛇式方法是什么?首先想到的是:

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    for x in xrange(0, len(mystuff)-1, 3):
        print "%d %d %s" % tuple(mystuff[x:x+3])
    

    但我觉得这很尴尬。我确定有更好的方法吗?


    好吧,除非后来有人提供了一个更好的例子,我认为gnibler的解决方案是最好的\最接近的,尽管一开始可能不太明显它是如何做到的:

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    for x in zip(*[iter(mystuff)]*3):
        print "{0} {1} {2}".format(*x)
    
    6 回复  |  直到 11 年前
        1
  •  12
  •   John La Rooy    14 年前
    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    for x in zip(*[iter(mystuff)]*3):
        print "%d %d %s"%x
    

    或使用 .format

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    for x in zip(*[iter(mystuff)]*3):
        print "{0} {1} {2}".format(*x)
    

    如果格式字符串不是硬编码的,您可以解析它来计算每行有多少个术语

    from string import Formatter
    num_terms = sum(1 for x in Formatter().parse("{0} {1} {2}"))
    

    综合起来就可以

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    fmt = "{0} {1} {2}"
    num_terms = sum(1 for x in Formatter().parse(fmt))
    for x in zip(*[iter(mystuff)]*num_terms):
        print fmt.format(*x)
    
        2
  •  4
  •   Josh Wright    14 年前

    首先,我将使用2.6中更新的字符串格式化方法+

    print "{0} {1} {2}".format(*mystuff[x:x+3])
    
        3
  •  4
  •   Ken    14 年前

    我想 join 是Python中最相似的功能:

    (format t "~{~D, ~}" foo)
    
    print(foo.join(", "))
    

    当你有多个物品在里面的时候,情况会更糟,就像你看到的,但是如果你有一个 group-by 函数(无论如何,它确实有用!)我想你可以让它工作而不必太费事。类似:

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    print(["%d %d %s" % x for x in group(mystuff, 3)].join("\n"))
    
        4
  •  3
  •   Walter Mundt    14 年前

    我想说,最大的蟒蛇应该是把名单做得更深:

    mystuff = [(1, 2, "Foo"), (34, 42, "Ni"), (12, 14, "Blue")]
    for triplet in mystuff:
        print "%d %d %s" % triplet
    
        5
  •  2
  •   eyquem    11 年前
    stuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    
    it = iter(stuff)
    itn = it.next
    
    print '\n'.join("%d %d %s" % (el,itn(),itn())
                    for el in it)
    

    我觉得很容易理解

        6
  •  0
  •   ksed    11 年前

    基于赖特的两行:

    mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
    print '\n'.join("{0},{1},{2}".format(*mystuff[x:x+3]) for x in xrange(0, len(mystuff)-1, 3))