python中的列表列表-将每个内部输入列表视为坐标迭代数学函数

juzqafwq  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(167)

这是我尝试运行的代码的简化版本,但本质上我们的输入可以被视为它们自己方向上的坐标。我只想让操作--在本例中是求和--在每组“坐标”(内部列表)之间起作用,然后对输入(外部列表)中的所有值通过“for循环”迭代地继续。
据我所知,i和j都在同时变化,我需要输入一个“j”,然后在改变到下一个j之前运行所有可能的“i”值。
注意#不允许使用numpy或pandas等外部软件包!!
这是我一直在使用的代码

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [1, 2, 3]
c = []

def summation(one, two):
    for i in list(range(len(one))):
        for j in  list(range(len(two))):
            summ = one[j][i] + two[j]
            c.append(summ)
    print(c)
    
summation(a, b)

我发现问题在于函数迭代索引i和j的方式。
我的RED输出是c = [2, 4, 6, 5, 6, 7, 8, 10, 12]
我尝试改变for语句的顺序,以及输入i和j的顺序。
据我所知,i和j都在同时变化,我需要输入一个“j”,然后在改变到下一个j之前运行所有可能的“i”值。
产出如下:

# This specific code above gives:
[2, 6, 10, 3, 7, 11, 4, 8, 12]
ecfsfe2w

ecfsfe2w1#

我需要输入一个“j”,然后在改变到下一个j之前运行所有可能的“i”值。
这意味着:

  • for j in ...必须是外部循环,for i in ...必须是内部循环。
  • jone中的一个子列表的索引。然后你需要for j in range(len(one))),而不是for j in range(len(two))

(BTW这里的list()是不必要的)。

  • itwo内部的值的索引。然后你需要for i in range(len(two)),而不是for i in range(len(one))

你需要two[i],而不是two[j]

  • 如果你做了这些修改,你需要交换两个循环。

结果是:

for j in range(len(one)):
    for i in range(len(two)):
        summ = one[j][i] + two[i]

(It交换ij的含义,然后简单地将one[j][i]固定为one[i][j]会更简单,但我想坚持你最初的解释。
与其摆弄索引(如您所见,索引很容易出错),更习惯的做法是直接遍历列表的值。然后,您需要zip函数来并行遍历onetwo的一个子列表。

for sub_one in one:
    for x, y in zip(sub_one, two):
        summ = x + y
pod7payv

pod7payv2#

假设 a 中的子列表与 b 中的子列表大小相同,则:

a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [1, 2, 3]

def summation(a, b):
    r = []
    for _a in a:
        r.extend([x+y for x, y in zip(_a, b)])
    return r

print(summation(a, b))

输出:

[2, 4, 6, 5, 7, 9, 8, 10, 12]

相关问题