列表中连续对的总和,包括最后一个元素与第一个元素的总和

Posted

技术标签:

【中文标题】列表中连续对的总和,包括最后一个元素与第一个元素的总和【英文标题】:Sum of consecutive pairs in a list including a sum of the last element with the first 【发布时间】:2020-11-22 13:02:17 【问题描述】:

我有一个像[1,3,5,6,8,7] 这样的元素列表。 我想要一个列表中两个连续元素之和的列表,最后一个元素也与列表的第一个元素相加。 我的意思是在上述情况下,我想要这个列表: [4,8,11,14,15,8]

但是在for循环中添加最后一个元素和第一个元素时,会出现索引超出范围。 考虑以下代码:

List1 = [1,3,5,6,8,7]
List2 = [List1[i] + List1[i+1] for i in range (len(List1))]

print(List2)

【问题讨论】:

您希望列表中的最后一个8 是预期结果吗? 不应该使用 len -1 或 % len 吗? @Ederic Oytas,是的,它是最后一个元素和第一个元素的总和,反之亦然。 i+1 更改为(i+1) % len(List1) @AdnanAkram - 关于 len - 1,你是对的,但模数应该会产生预期的结果(请看上面的 Steven Rumbalski 评论) 【参考方案1】:
List2 = [List1[i] + List1[(i+1)%len(List1)] for i in range (len(List1))]

【讨论】:

我喜欢它,虽然它有点低效,因为模运算符实际上只对最后一个元素有用。【参考方案2】:
[List1[i] + List1[(i+1) % len(List1)] for i in range(len(List1))]

[sum(tup) for tup in zip(List1, List1[1:] + [List1[0]])]

[x + y for x, y in zip(List1, List1[1:] + [List1[0]])]  

【讨论】:

【参考方案3】:

因为i+1,索引超出范围

List1 = [1,3,5,6,8,7]
List2 = [List1[i-1] + List1[i] for i in range (len(List1))]

print (List2)

这种方法有点用 结果:

[8, 4, 8, 11, 14, 15]

【讨论】:

它错过了最后一个整数 (8) 不,第一个元素是最后一个整数。【参考方案4】:

这会旋转列表

In [9]: List1[1:] + List1[:1]                                                                 
Out[9]: [3, 5, 6, 8, 7, 1]

所以以下工作完美

In [8]: [x + y for x, y in zip(List1, List1[1:] + List1[:1])]                                 
Out[8]: [4, 8, 11, 14, 15, 8]

【讨论】:

【参考方案5】:

您实际上在做的是在列表中添加连续的项目,但是当您到达最后一个索引时,您的代码仍然会在最后一个索引上添加一个,这会导致索引超出范围错误。您应该考虑使用:

List1 = [1,3,5,6,8,7]
List2 = [List1[i] + List1[i+1] for i in range (len(List1) - 1)]
List2.append(List1[0] + List1[-1])

print (List2)

【讨论】:

不知道你为什么失望,你的答案是产生所要求结果的两个之一【参考方案6】:

当你将它运行到 len(List1) - 1 因此,当 i 值为 len(List1) - 1 时,i + 1 将超出范围(即 len(List1)), 所以你可以试试这个解决方案:

List2 = [List1[i-1] + List1[i] for i in range (len(List1))]

或者你可以这样做:

List2 = [List1[i] + List1[i+1] for i in range (len(List1)-1)]

或者您也可以使用任何其他逻辑。 干杯!

【讨论】:

【参考方案7】:

这是另一个丑陋的解决方案:

List1 = [1,3,5,6,8,7] 
List2 = [List1[i] + (List1+[List1[0]])[i+1] for i in range (len(List1))]

print (List2)

【讨论】:

【参考方案8】:

还有一些尚未回答的 Pythonic 答案:

使用map 可以更具可读性:

List2 = list(map(sum, zip(List1, List1[1:] + List1[:1])))

你也可以使用itertools来偏移列表:

import itertools
List2 = list(map(sum, zip(List1, itertools.islice(itertools.cycle(List1), 1, None))))

【讨论】:

【参考方案9】:

i == 5时,则进入“if”语句,i设置为-1。 注意List[-1]List[len(List) - 1]是一样的,也就是说List[i+1]会变成List[0],列表的第一个元素。

for i in range(len(List1)):
    if i == len(List1) - 1:
        i = -1
    List2.append(List1[i] + List1[i+1])

【讨论】:

欢迎来到 Stack Overflow。在 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案以解释此代码如何回答问题,以便它不仅对 OP 有用,而且对遇到相同问题的其他用户也有用。

以上是关于列表中连续对的总和,包括最后一个元素与第一个元素的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何获取列表元素的总和? [关闭]

Java题目 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

在erlang中列出尾部模式匹配

输入一个一维数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

使用 Linq 连续总和大于 0 的连续元素

C语言试题140之输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组