【问题标题】:Adding two lists while checking length在检查长度时添加两个列表
【发布时间】:2016-11-21 04:26:30
【问题描述】:

我遇到了一个问题,我必须在考虑长度的同时将 2 个列表加在一起。例如,如果list1 = [1,2]list2 = [3,4,5] 答案将是[1+3,2+4,5][4,6,5]

到目前为止我所拥有的是:

def addsum(list1,list2):
    new_list = []
    if len(list1) > len(list2):
       new_list = list1[0:]+list2[0:]

我不太确定如何解决这个问题,因为我是列表新手。非常感谢您的帮助!

【问题讨论】:

    标签: python python-2.7 list python-3.x


    【解决方案1】:

    您应该在列表理解中使用来自 itertools 的 zip_longestfillvalue0

    r = [sum(i) for i in zip_longest(list1, list2, fillvalue=0)]
    

    zip_longest 将输入列表中的元素配对(此处为list1list2)。如果一个列表较小,则将较大列表的剩余元素与作为fillvalue 提供的值配对(我们在此处分配给0)。

    现在,r 等于:

    print(r) # [4, 6, 5]
    

    同样,您可以使用 map 代替 list-comp:

    # Python 3.x
    r = list(map(sum, zip_longest(list1, list2, fillvalue=0)))
    # Python 2.7
    r = map(sum, zip_longest(list1, list2, fillvalue=0))
    

    并为r 获得相同的结果。

    【讨论】:

      【解决方案2】:

      穷人的做法:

      def addsum(list1,list2):
          if len(list1) >= len(list2): 
              for i in range(len(list2)):
                  list1[i]=list1[i]+list2[i]
              return list1
          else:
              for i in range(len(list1)):
                  list2[i]=list1[i]+list2[i]
              return list2
      

      【讨论】:

        【解决方案3】:

        我也会使用zip_longest 解决方案,但是在您的代码中构建这就是我要做的

        def addsum(list1, list2):
            if len(list1) < len(list2):
                list1, list2 = list2, list1
            result=list(list1)
            for i,x in enumerate(list2):
                result[i] += x
            return result
        

        首先确保第一个列表是最长的,如果不是,则交换它们,然后复制最长列表,最后将较短列表的元素按位置添加到副本中并返回

        >>> addsum([1,2],[3,4,5])
        [4, 6, 5]
        >>> 
        

        【讨论】:

          【解决方案4】:

          虽然zip_longest 更简洁,但另一种可能性是使用试错法(如果您厌倦了“ifs”),如下所示:

          def addsum(list1, list2):
              res = []
              i = 0
              while i < len(list1) or i < len(list2):
                  try:
                      res.append(list1[i]+list2[i])
                  except IndexError:
                      try: res.append(list1[i])
                      except IndexError: res.append(list2[i])
                  i += 1
              return res
          

          【讨论】:

            【解决方案5】:

            zip_longest 上的文档:

            创建一个迭代器,聚合来自每个可迭代对象的元素。如果 iterables 的长度不均匀,则用fillvalue 填充缺失值。迭代一直持续到最长的可迭代对象用完为止。

            代码如下:

            from itertools import zip_longest
            [x + y for x, y in zip_longest([1,2], [3,4,5], fillvalue=0)]
            

            输出:

            [4, 6, 5]
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-23
              • 2017-08-30
              • 2014-07-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-29
              相关资源
              最近更新 更多