0

节目说明:

程序接受l包含其他列表的列表。l长度大于 3 的列表的输出将相应更改:具有索引的元素3将是已删除元素的总和(从第三个到末尾)。

我的解决方案:

l = [[1,2], [3,4,4,3,1], [4,1,4,5]]
s = 0
for i in range(len(l)-1):
  if len(l[i]) > 3:
      for j in range(3,len(l[i])-1):
        s += l[i][j]
        l[i].remove(l[i][j])
      l[i].insert(len(l[i]),s)
l

测试:

Input: [[1,2], [3,4,4,3,1], [4,1,4,5]]
Expected Output: [[1, 2], [3, 4, 8], [4, 1, 9]]

程序运行:

Input: [[1,2], [3,4,4,3,1], [4,1,4,5]]
Output: [[1, 2], [4, 4, 3, 1, 3], [4, 1, 4, 5]]

问题:我不明白在这种情况下问题的根源是什么,为什么要在末尾添加一些额外的数字,而不是 summ。我将不胜感激。

4

3 回答 3

1

remove是错误的功能。你应该del改用。阅读文档以了解原因。

另一个错误是您没有重置s。它应该设置0在外部 for 循环中。

但是你把它弄得太复杂了。我认为最好展示一下你如何做到这一点真的很容易。

for e in l:              # No need for range. Just iterate over each element
    if len(e) > 3:
        e[2]=sum(e[2:])  # Sum all the elements
        del(e[3:])       # And remove

或者,如果您希望它作为创建新列表且不更改旧列表的列表推导:

[e[0:2] + [sum(e[2:])] if len(e)>3 else e for e in l]
于 2020-11-11T09:40:36.543 回答
1

首先,是错误的方法,因为它按remove()删除,而不是索引:

Python 列表方法 remove() 在列表中搜索给定元素并删除第一个匹配元素。

你想使用delor pop()

其次,您不是从列表末尾切分所有元素,而只是切分一个值。

于 2020-11-11T09:42:52.770 回答
1

remove是您的代码无法正常工作的原因。(正如 Mat-KH 在另一个答案中提到的)

您可以使用列表推导和 lambda 函数使其成为两个班轮。

func = lambda x: x if len(x) < 3 else x[:2] + [sum(x[2:])]
l = [func(x) for x in l]
于 2020-11-11T09:47:53.647 回答