给定一个数字列表,创建一个新的数字列表,使第一个和最后一个数字被添加并存储为第一个数字,第二个和倒数第二个数字存储为第二个数字,依此类推
num_list = [1,2,3,4,5,6]
num_list2 = [num_list[-1] + num_list[0], num_list[-2] + num_list[1],
num_list[-3] + num_list[2]]
print(num_list2)
输出为[7,7,7]
我通过这种方式获得了正确的输出,但我确信这不是一种有效的方法。有没有更好的办法?我也应该检查列表的偶数和奇数长度,如果它是奇数个整数,将原始列表中的中心整数添加到新列表的末尾但不知道我将如何进行这样做
答案 0 :(得分:0)
我认为这更有效率,我只是做了一个for循环:
num_list2 = []
num_list = [1,2,3,4,5,6]
for i in range(round(len(num_list)/2)):
num_list2.append(num_list[i]+num_list[-(i+1)])
print(num_list2)
输出:
[7, 7, 7]
答案 1 :(得分:0)
让我们使用reversed
[x + y for x, y in zip(num_list, list(reversed(num_list)))][:len(num_list)//2]
Out[406]: [7, 7, 7]
答案 2 :(得分:0)
这是一种效率低下的[1]但却很明确的方法:
from itertools import zip_longest # or izip_longest in Python2
lst = [1,2,3,4,5,6]
chop_index = len(lst) // 2 # (or +1, depending on how you want to handle odd sized lists)
lh, rh = lst[:chop_index], lst[:chop_index-1:-1]
print(lh, rh) # To see what's going on in the "chopping"
sums = [x + y for (x,y) in zip_longest(lh, rh, fillvalue=0)]
print(sums)
您可以使用islice
和reversed
迭代器来改进它,或者仅使用索引数学。
输出:
lst = [1,2,3,4,5,6] => [7, 7, 7] lst = [1,2,3,4,5,6,7] => [8, 8, 8, 4]
[1]这使得列表部分有两个副本。对于长列表,这很愚蠢,你不应该使用这种方法。它主要用于突出显示zip_longest
的fillvalue可选参数。
答案 3 :(得分:0)
在生成器上使用itertools.islice
:
from itertools import islice
num_list = [1,2,3,4,5,6]
generator = (x + y for x, y in zip(num_list, num_list[::-1]))
print(list(islice(generator, len(num_list)//2)))
# [7, 7, 7]
答案 4 :(得分:0)
您可以使用以下方法,该方法与非对称列表兼容。
def sum_start_end(list_):
result = [x + y for x, y in zip(list_, list_[::-1])][:len(list_) // 2]
if len(list_) % 2 != 0:
result.append(list_[len(list_) // 2])
return result
所以对称列表
>>> num_list = [1, 2, 3, 4, 5, 6]
>>> sum_start_end(num_list)
[7, 7, 7]
和非对称列表
>>> num_list = [1, 2, 3, 4, 5, 6, 7]
>>> sum_start_end(num_list)
[8, 8, 8, 4]
答案 5 :(得分:0)
它比你想象的要简单。 只需观察您的手动尝试并尝试从中推断。我们可以简单地做到
x = len(num_list)//2 + len(num_list)%2
for i in range(x):
sumBoth = num_list[i] + num_list[-i-1]
num_list2.append(sumBoth)
或使用更简单的单行
num_list2 = [ num_list[i] + num_list[-i-1] for i in range(len(num_list)//2+len(num_list)%2)]
这适用于偶数和奇数长度,因为范围末端的len(num_list)%2
。