在列表

时间:2016-03-10 23:32:31

标签: python list sum

如何编写一个获取整数列表的函数,并创建一个与原始列表具有相同元素数的新列表,以使新列表中的每个整数都是其原始列表中邻居和自身的总和。例如,如果是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

但在这两种情况下,我都不认为我的想法/尝试是在正确的轨道上......我真的很感激有经验的人可能提供的任何帮助,提示和技巧。

3 个答案:

答案 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不超出数组的范围。)