【问题标题】:How can I add every element in a list of unequal length?如何在长度不等的列表中添加每个元素?
【发布时间】:2022-01-05 12:24:01
【问题描述】:

所以这是我的代码,它尝试添加列表中的每个元素,而不管它们的长度。

def elem_sum(lst1, lst2):
   f_len = len(lst1) - (len(lst2) - 1)
   for i in range(0, len(lst2), 1):
      if f_len - i >= len(lst1):
         break
      else:
         lst1[i] = lst1[i] + lst2[i]
   return lst1

当提供某些输入(例如elem_sum([1, 2, 3], [10, 20]))时,

输出正确返回[11, 22, 3]

而其他输入,例如elem_sum([1, 2, 3], [10, 20, 30, 40])

输出返回错误。

我应该在此处进行哪些更改以确保我的代码适用于任何给定的输入集??

【问题讨论】:

  • 有一个可能的捷径。 [sum(t) for t in itertools.zip_longest(lst1, lst2, fillvalue=0)]
  • @Code-Apprentice 一开始我也想知道同样的事情,但我认为问题中的示例输出[11, 22, 3] 已经足够清楚了。
  • 您复杂的f_len 用法毫无意义。例如,elem_sum([1, 2, 3], [10]) 返回[1, 2, 3]
  • 附带说明,我很难理解f_len 的用途。我认为您正在尝试检查 i 是否超出 list1 的长度,以便您不会对其进行索引并导致错误。如果是这样,您应该直接这样做:if i >= len(lst1)。现在你可以摆脱f_len了。

标签: python list function


【解决方案1】:

可能值得考虑的一个选项是利用现有的库例程从不等长的列表中为您提供成对的数字。 itertools 包中的 zip_longest 函数将执行此操作,给出一个元组序列。到达其中一个列表的末尾后,将使用指定的填充值填充缺失值,默认为None,但您可以传递自己的填充值。

例如,

from itertools import zip_longest

lst1 = [1, 2, 3]
lst2 = [10, 20, 30, 40]

for t in zip_longest(lst1, lst2, fillvalue=0):
    print(t)

给予:

(1, 10)
(2, 20)
(3, 30)
(0, 40)

所以你可以编写你的函数来使用一个列表推导来计算每个元组的总和:

from itertools import zip_longest

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

print(elem_sum([1, 2, 3], [10, 20, 30, 40]))

给出:

[11, 22, 33, 40]

如果您使用的不是非常旧的 Python 版本,itertools 包在标准 Python 库中,因此您无需安装任何附加包。

【讨论】:

    【解决方案2】:

    如果需要,您可以检查长度并交换列表:

        def elem_sum(lst1, lst2):
            # Swap if needed
            if len(lst1) < len(lst2):
                lst1, lst2 = lst2, lst1
    
            f_len = len(lst1) - (len(lst2) - 1)
            for i in range(0, len(lst2), 1):
                if f_len - i >= len(lst1):
                    break
                else:
                    lst1[i] = lst1[i] + lst2[i]
            return lst1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-30
      • 2015-12-29
      • 1970-01-01
      • 2021-01-21
      • 2021-10-04
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多