【问题标题】:How can I refrain from using import and still get the same output from my function?如何避免使用 import 并仍然从我的函数中获得相同的输出?
【发布时间】:2022-01-17 16:35:21
【问题描述】:

所以我正在尝试编写一个函数elem_sum(lst1:List[int], lst2:List[int]),它接受2 个输入作为列表,并在lst1lst2 中按元素返回求和。 lst1lst2 的长度可能不同。假设lst1 = [a, b, c] 和lst2 = [d, e]。你的函数应该返回[a+d, b+e, c]

例子

elem_sum([1, 2, 3], [10, 20]) == [11, 22, 3]
elem_sum([1, 2, 3], [10, 20, 30, 40]) == [11, 22, 33, 40]
elem_sum([1], [2, 12]) == [3, 12]

这是我尝试过的方法,效果很好……

from itertools import zip_longest

def elem_sum(lst1, lst2):
    return [sum(t) for t in zip_longest(lst1, lst2, fillvalue=0)]

但是,我想找到一个不使用 itertoolsImport 的解决方案...我应该在我的代码中添加或更改什么?

【问题讨论】:

    标签: python python-3.x list function


    【解决方案1】:

    一种方法是用内置的 zip 函数替换 zip_longest,但正如您所知,它只会删除较长数组的剩余元素。所以你可以做的是使用 zip 然后只附加较长数组的剩余元素:

    def elem_sum(lst1, lst2):
        shorter_length = min(len(lst1), len(lst2))
        return [sum(t) for t in zip(lst1, lst2)] + lst1[shorter_length:] + lst2[shorter_length:]
    

    在较短的数组上使用索引[shorter_length:] 只会返回一个空数组。因此,我们可以将它们连接起来。

    【讨论】:

      【解决方案2】:

      将零添加到较短的部分:

      def elem_sum(l1, l2):
          len_1 = len(l1)
          len_2 = len(l2)
          max_len = max(len_1, len_2)
          min_len = min(len_1, len_2)
          for i in range(max_len-min_len):
              if len_2 < len_1:
                  l2.append(0)
              if len_1 < len_2:
                  l1.append(0)
          l_r = []
          for i in range(max_len):
              l_r.append(l1[i] + l2[i])
          return l_r
      
      
      print(elem_sum([1, 2, 3], [10, 20]))
      print(elem_sum([1, 2, 3], [10, 20, 30, 40]))
      print(elem_sum([1], [2, 12]))
      

      输出:

      [11, 22, 3]
      [11, 22, 33, 40]
      [3, 12]
      

      【讨论】:

        【解决方案3】:

        如果您采用以下方法,则无需使用itertools

        def elem_sum(ls1, ls2):
            iter_list, other_list = (ls1, ls2) if len(ls1) < len(ls2) else (ls2, ls1)
            return [sum(x) for x in zip(iter_list, other_list)]+ other_list[len(iter_list):]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-06
          • 2017-04-16
          • 1970-01-01
          • 2012-03-10
          • 2012-12-08
          • 1970-01-01
          • 1970-01-01
          • 2020-02-05
          相关资源
          最近更新 更多