【问题标题】:How do I iterate over the tuples of the items of two or more lists in Python? [duplicate]如何在 Python 中遍历两个或多个列表项的元组? [复制]
【发布时间】:2010-11-15 16:10:27
【问题描述】:

具体来说,我有两个字符串列表,我想将它们组合成一个字符串,其中每一行是列表中接下来的两个字符串,用空格分隔:

a = ['foo1', 'foo2', 'foo3']
b = ['bar1', 'bar2', 'bar3']

我想要一个可以返回的函数 combine_to_lines():

"""foo1 bar1
foo2 bar2
foo3 bar3"""

我承认我已经解决了这个问题,所以我将发布答案。但也许其他人有更好的,或者看到了我的缺陷。

更新:我将上面的示例过度简化了。在我的实际问题中,这些行以更复杂的方式格式化,需要解压缩从 zip() 返回的元组。但是感谢mhawke 为这个示例提出了最简单的解决方案。

【问题讨论】:

    标签: python loops


    【解决方案1】:

    在 python 3.x 中:

    '\n'.join(' '.join(x) for x in zip(a, b))
    

    zip 返回一个元组列表。当 a 或 b 中较短的一个停止时,zip 停止。

    在 python 2.x 中:

    如果 itertools.izip 会在其中一个列表用完元素时停止,但 itertools.izip_longest 将停止直到列表没有更多元素

    import itertools
    '\n'.join(' '.join(x) for x in itertools.izip(a, b))
    
    '\n'.join(' '.join(x) for x in itertools.izip_longest(a, b))
    

    【讨论】:

    • 也感谢 mhawke 提出的主要解决方案
    • 为什么上面写“In Python 3.x”?我刚刚确认 zip 在 Python 2.7.5 上停止时 a 或 b 中的较短者停止。
    • 你是对的!据我了解,这不是 python 2.x 之前的一个功能,它是从 3.x 向后移植的,对吗?如果是,我是从哪个版本更新的?
    【解决方案2】:

    我意识到这是一个非常古老的问题,但有趣的是,这可以看作是matrix transposition

    >>> import numpy
    >>> data = numpy.array([['foo1','foo2','foo3'],['bar1','bar2','bar3']])
    >>> print(data)
    [['foo1' 'foo2' 'foo3']
     ['bar1' 'bar2' 'bar3']]
    >>> print(data.transpose())
    [['foo1' 'bar1']
     ['foo2' 'bar2']
     ['foo3' 'bar3']]
    

    如果您要处理大型数据集或更多列表,这可能是更有效的解决方案。

    【讨论】:

      【解决方案3】:

      zip返回的元组不需要解包和重新打包:

      '\n'.join(' '.join(x) for x in zip(a, b))
      

      【讨论】:

        【解决方案4】:

        简单如下:

        " ".join([a[x] + " " + b[x] for x in range(len(a))])
        

        【讨论】:

        • 新行在哪里?
        【解决方案5】:
        '\n'.join(((str(x) + ' ' + str(y)) for (x, y) in zip(a, b)))
        

        【讨论】:

          【解决方案6】:

          这是一个单行。如果您愿意,可以做x + ' ' + y,不确定它是否会更慢。

          >>> a = ['foo1', 'foo2' , 'foo3']
          >>> b = ['bar1', 'bar2', 'bar3']
          >>> '\n'.join(' '.join([x,y]) for (x,y) in zip(a,b))
          'foo1 bar1\nfoo2 bar2\nfoo3 bar3'
          >>> print _
          foo1 bar1
          foo2 bar2
          foo3 bar3
          

          【讨论】:

            【解决方案7】:
            >>> a = ['foo1', 'foo2', 'foo3']
            >>> b = ['bar1', 'bar2', 'bar3']
            >>> for i in zip(a,b):
            ...   print ' '.join(i)
            ...
            foo1 bar1
            foo2 bar2
            foo3 bar3
            

            【讨论】:

              【解决方案8】:

              zip function“返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。”

              def combine_to_lines(list1, list2):
                  return '\n'.join([' '.join((a, b)) for a, b in zip(list1, list2)])
              

              【讨论】:

                【解决方案9】:

                您是在问zip 函数吗?

                【讨论】:

                • 是的。我不记得了,谷歌搜索花了一点时间来唤起我的记忆。也许这个问题会在以后的搜索中出现。
                • 确实如此,并帮助我记忆犹新。非常感谢。
                • 另一个问题作为问题的答案? :)
                猜你喜欢
                • 1970-01-01
                • 2016-10-25
                • 1970-01-01
                • 2018-11-26
                • 1970-01-01
                • 1970-01-01
                • 2018-09-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多