【问题标题】:Combining two lists in python3在python3中组合两个列表
【发布时间】:2013-07-30 00:30:32
【问题描述】:

假设我有两个任意但长度相等的列表,例如:

['a','b','c','d']
['r','t','y','h']

对于这两个列表,我希望输出为:

'ar', 'bt', 'cy', 'dh'

基本上,第一个列表的第一个元素到第二个列表的第一个元素等等。我该怎么做?请注意,列表可以是任意长度,不仅仅是示例显示的长度,而是第一个列表的长度等于第二个列表的长度。

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:

    zip 将列表组合起来,然后将join 每对字符串组合成一个字符串:

    >>> list1 = ['a','b','c','d']
    >>> list2 = ['r','t','y','h']
    >>> [''.join(pair) for pair in zip(list1, list2)]
    ['ar', 'bt', 'cy', 'dh']
    

    【讨论】:

      【解决方案2】:

      您可以使用mapzip 来完成这项工作:

      >>> l1=['a','b','c','d']
      >>> l2=['r','t','y','h']
      >>> map(lambda(x,y): x+y, zip(l1,l2))
      ['ar', 'bt', 'cy', 'dh']
      

      zip 所做的是创建一个元组列表,其中第 i 个元组包含每个列表中的第 i 个元素。然后你可以通过连接将每个元组转换成一个字符串(使用lambda(x,y): x+y)。

      【讨论】:

      • 不幸的是,该语法将不再适用于 Python 3 —— 我的意思是 lambda (x,y): x+y
      • 列表推导通常被认为比maplambda 更Pythonic。除了语法问题之外,您还需要在 Python 3 上将其包装在对 list 的调用中,因为 map 是惰性的。我的解决方案还有一个优点,它可以扩展以处理任意数量的输入列表,因为它使用join
      【解决方案3】:

      如果您想要一种功能性方法,您可以使用mapoperator.add

      import operator
      map(operator.add,['a','b','c','d'], ['r','t','y','h'])
      >>>['ar', 'bt', 'cy', 'dh']
      

      不需要lambdas 也不需要列表解析来进行连接。

      注意:对于那些说不是 Python 3 的人,这个转储可能会让你改变主意:

      Python 3.1.3 (r313:86834, Nov 28 2010, 10:01:07)
      [GCC 4.4.5] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import operator
      >>> list(map(operator.add, ['a','b'],['r','t']))
      ['ar', 'bt']
      

      【讨论】:

      • 虽然不是 Python3 :p
      • 如果您想概括,请使用''.join。此外,列表推导也是功能性的。
      • @agf 我看不出''.joinoperator.add 更能概括它,后者适用于任何输入。 join 仅适用于字符串列表。
      • @PauloBu add 只接受两个输入列表,''.join 接受任意数量的输入列表。
      • @PauloBu,是的。我指的是map 在 Python3 中没有返回列表
      【解决方案4】:

      上述答案似乎也适用于 Python 2.7。此外,您可以只使用 zip 和内联加法器 (lambda):

      1:

      list1 = ['a','b','c','d']
      
      list2 = ['r','t','y','h']
      
      add = lambda pair:pair[0]+pair[1]
      
      print [add(pair) for pair in zip(list1, list2)]
      

      2:

      或仅一行:

      print map(lambda pair:pair[0]+pair[1],[pair for pair in zip(list1,list2)])
      

      3:

      map() 允许映射多个参数,这会产生一个简短的解决方案:

      print map(lambda x,y:x+y, list1, list2)
      

      【讨论】:

        【解决方案5】:

        这里有更多的方法来做到这一点

        >>> list1 = ['a','b','c','d']
        >>> list2 = ['r','t','y','h']
        
        >>> [x + y for x, y in zip(list1, list2)]
        ['ar', 'bt', 'cy', 'dh']
        
        >>> it = iter(list2)
        >>> [x + next(it) for x in list1]
        ['ar', 'bt', 'cy', 'dh']
        

        【讨论】:

          猜你喜欢
          • 2011-11-29
          • 2017-07-22
          • 1970-01-01
          • 2017-04-13
          • 1970-01-01
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多