列表中连续对的总和,包括最后一个元素与第一个元素的总和
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题目 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。