如何编写一个获取整数列表的函数,并创建一个与原始列表具有相同元素数的新列表,以使新列表中的每个整数都是其原始列表中邻居和自身的总和。例如,如果是a_list = [10, 20, 30, 40, 50]
,则为new_list = [30, 60, 90, 120, 90]
。
我尝试了列表理解;
def sum_neighbours(a_list):
b_list = a_list
li = [x+y for x in a_list for y in b_list]
return li
print(sum_neighbours([10, 20, 30, 40, 50]))
哪个给了我;
[20, 30, 40, 50, 60, 30, 40, 50, 60, 70, 40, 50,
60, 70, 80, 50, 60, 70, 80, 90, 60, 70, 80, 90, 100]
然后我尝试了for循环;
def sum_neighbours(a_list):
element1 = a_list[0]
new_list = []
for element in a_list:
element1 += element
new_list += element1
return new_list
print(sum_neighbours([10,20,30,40,50]))
投了一个TypeError: 'int' object is not iterable
但在这两种情况下,我都不认为我的想法/尝试是在正确的轨道上......我真的很感激有经验的人可能提供的任何帮助,提示和技巧。
答案 0 :(得分:3)
您可以从遍历列表索引的解决方案开始,如下所示:
def sum_neighbours1(a_list):
result = []
for i in range(len(a_list)):
if i == 0:
result.append(a_list[i] + a_list[i+1])
elif i == len(a_list)-1:
result.append(a_list[i-1] + a_list[i])
else:
result.append(a_list[i-1] + a_list[i] + a_list[i+1])
return result
print(sum_neighbours1([10,20,30,40,50]))
或者,您可以构建三个不同的列表:原始列表,左侧邻居列表和右侧邻居列表。我们必须将0
放在辅助列表的前面或后面。每个列表必须至少与原始列表一样长。
将三个列表压缩在一起,然后添加它们:
def sum_neighbours2(a_list):
priors = [0] + a_list
subsequents = a_list[1:] + [0]
return map(sum, zip(priors, a_list, subsequents))
请注意,我使用了功能表示法map(sum, data)
,但我可以轻松地使用列表表达式:
def sum_neighbours3(a_list):
priors = [0] + a_list
subsequents = a_list[1:] + [0]
return [p+a+s for p,a,s in zip(priors, a_list, subsequents)]
而且,如果我渴望将结果作为单个表达式(例如,如果它必须适合lambda表达式),那么就是:
def sum_neighbours4(a_list):
return [
left + a + right
for left, a, right in zip(
[0] + a_list,
a_list,
a_list[1:] + [0])
]
答案 1 :(得分:2)
以下是我使用zip
的单行解决方案:
def sum_neighbours(a) :
return [sum(x) for x in [(a[0],a[1])]+zip(a,a[1:],a[2:])+[(a[-2],a[-1])]]
print sum_neighbours([10, 20, 30, 40, 50]) # display [30, 60, 90, 120, 90]
with:
a
,原始列表zip(a,a[1:],a[2:])
,3元组生成[(a[0],a[1])] and [(a[-2],a[-1])]
,特殊情况下的2元组(列表的第一个和最后一个数字)答案 2 :(得分:-1)
你可能想要一个for i in range
循环,并直接索引到数组中,这样你就可以查看i + 1和i-1索引处的元素(确保检查你的+ / - 1不超出数组的范围。)