使用嵌套的 while 循环创建求和或幂列表,python

Using nested while loops to create a sum or powers list, python

我最近发布了关于此的帖子,但我仍然无法正常工作。这是对我需要的更好的描述: 如果你的基数列表是 [1, 2, 3] 而你的指数列表是 [2, 4],那么你的列表 return 有两个元素,每个元素一个,是这样的:[1^2 + 2^2 + 3^2、1^4 + 2^4 + 3^4]。你的任务是使用嵌套的 while 循环计算这些元素,并将结果存储在列表中,这样你就可以在最后 return 它。

def sum_of_powers(base_list, expo_list):

    end = []
    j = 0
    i = 0
    while j < len(expo_list):
        sub_accum = []
        while i < len(base_list):
            sub_accum.append(base_list[i]**expo_list[j])
            i += 1
            end.append(sub_accum)
        j += 1

    return end

>>>base_list = [1, 2, 3]
>>>>expo_list = [1, 2]
>>>>print(sum_of_powers(base_list, expo_list))
[[1,2,3],[1,2,3],[1,2,3]]

期望的结果是: [6, 14] 这是(显然) [1^1 + 2^1 + 3^1, 1^2 + 2^2 + 3^2]]

我认为 "j" 没有被正确添加,我不知道如何添加 "sub_accum" 中的元素。我就是想不通这个!欢迎任何帮助!谢谢大家!

当你把它放在列表中时,append 不计算数据 因此您需要添加数据而不是附加数据 而且你没有重新初始化 i 的值所以它只运行一次

def sum_of_powers(base_list, expo_list):

        end = []
        sum = 0 #added sum
        j = 0
        i = 0
        k = 0 #added for loop in getting sum

        while j < len(expo_list):
            sum = 0 #re-initialize value to 0 for the next loop
            i = 0 #re-initialize value to 0 for the next loop
            k = 0 #re-initialize value to 0 for the next loop
            sub_accum = []

            while i < len(base_list):
                sub_accum.append(base_list[i]**expo_list[j])
                i += 1

            while k < len(sub_accum): #loop though temporary list to add its values
                sum = sum + sub_accum[k]
                k += 1

            end.append(sum) #end should be at level of 1st layer when all have been calculated and should only insert the sum of 'sub_accum'

            j += 1 

        return end

下次请使用for循环,这样你就不会忘记重新初始化你的内部值

给你。只需对当前代码进行少量修改,即可满足您的需求:

def sum_of_powers(base_list, expo_list):

    end = []
    endsum = []
    j = 0
    while j < len(expo_list):
        sub_accum = []
        i = 0
        while i < len(base_list):
            sub_accum.append(base_list[i]**expo_list[j])
            i += 1
        end.append(sub_accum)
        j += 1

    for i in range(len(end)):
        endsum.append(sum(end[i]))

    return endsum

base_list = [1, 2, 3]
expo_list = [1, 2]
print(sum_of_powers(base_list, expo_list))
[6, 14]

主要是 i = 0 重新初始化的位置,以及 end.append.

为什么不试试这个:

def sum_of_powers(base_list, expo_list):
    exp_sum = lambda lst, n: reduce(lambda x,y: x + y**n, lst)
    return [exp_sum(base_list, e) for e in expo_list]

base_list = [1, 2, 3]
expo_list = [1, 2]
print(sum_of_powers(base_list, expo_list))

它更实用也更简单,使用:

  1. 列表理解
  2. mapreduce