【问题标题】:Python List selection under certain condition?特定条件下的Python列表选择?
【发布时间】:2018-10-18 15:08:51
【问题描述】:

MWE:我想做以下事情:

M=[[0,2,1,4,9,7,6,0],
    [0,7,1,4,7,7,6,2],
    [0,5,1,4,5,5,5,0],
    [0,1,1,1,9,7,6,0],
    [0,2,1,8,8,7,8,2],
    [0,9,0,4,9,0,0,0],
    [0,2,3,4,4,6,6,0]]

s=[[1,2,3],[1,2],[4,5],[1,3,6,7]]

如果选择了s[0],那么操作应该是

  • 第一排M没有变化
  • M 的第 2 行 = M 的第 1 行 + M 的第 2 行
  • 第3行M=第3行M+(第1行M+第2行M)
  • 对于剩余的第r行=第r行M+(第1行M+第2行M+第3行M+第3行M),r=4,5,6,7

如果选择了s[2],那么操作应该是

  • 第4行M没有变化
  • M 的第 5 行 = M 的第 4 行 + M 的第 5 行
  • 而对于剩余的第r行=第r行M+(第4行M+第5行M),r=1,2,3,6,7

等等..

当每个计数器的 s 随机变化时,我该如何处理。这是我尝试过的代码,但最终卡住了。

for r in s:
    for i in range(len(M)):
        for j in range(len(M[0])):
            if s[0][0]==1
                M[1][i]=M[1][i]

在那之后我不知道该怎么做。我该怎么做?

【问题讨论】:

    标签: python python-2.7 list loops row


    【解决方案1】:

    以下将输出s的所有四个子列表的结果:

    from pprint import pprint
    from copy import deepcopy
    M=[[0,2,1,4,9,7,6,0],
        [0,7,1,4,7,7,6,2],
        [0,5,1,4,5,5,5,0],
        [0,1,1,1,9,7,6,0],
        [0,2,1,8,8,7,8,2],
        [0,9,0,4,9,0,0,0],
        [0,2,3,4,4,6,6,0]]
    s=[[1,2,3],[1,2],[4,5],[1,3,6,7]]
    def f(m, s):
        new = deepcopy(m)
        for r in s:
            for row in range(r, len(m)):
                for col in range(len(m[row])):
                    new[row][col] += m[r - 1][col]
        return new
    for i in s:
        pprint(f(M, i), width=40)
    

    这个输出:

    [[0, 2, 1, 4, 9, 7, 6, 0],
     [0, 9, 2, 8, 16, 14, 12, 2],
     [0, 14, 3, 12, 21, 19, 17, 2],
     [0, 15, 4, 13, 30, 26, 23, 2],
     [0, 16, 4, 20, 29, 26, 25, 4],
     [0, 23, 3, 16, 30, 19, 17, 2],
     [0, 16, 6, 16, 25, 25, 23, 2]]
    [[0, 2, 1, 4, 9, 7, 6, 0],
     [0, 9, 2, 8, 16, 14, 12, 2],
     [0, 14, 3, 12, 21, 19, 17, 2],
     [0, 10, 3, 9, 25, 21, 18, 2],
     [0, 11, 3, 16, 24, 21, 20, 4],
     [0, 18, 2, 12, 25, 14, 12, 2],
     [0, 11, 5, 12, 20, 20, 18, 2]]
    [[0, 2, 1, 4, 9, 7, 6, 0],
     [0, 7, 1, 4, 7, 7, 6, 2],
     [0, 5, 1, 4, 5, 5, 5, 0],
     [0, 1, 1, 1, 9, 7, 6, 0],
     [0, 3, 2, 9, 17, 14, 14, 2],
     [0, 12, 2, 13, 26, 14, 14, 2],
     [0, 5, 5, 13, 21, 20, 20, 2]]
    [[0, 2, 1, 4, 9, 7, 6, 0],
     [0, 9, 2, 8, 16, 14, 12, 2],
     [0, 7, 2, 8, 14, 12, 11, 0],
     [0, 8, 3, 9, 23, 19, 17, 0],
     [0, 9, 3, 16, 22, 19, 19, 2],
     [0, 16, 2, 12, 23, 12, 11, 0],
     [0, 18, 5, 16, 27, 18, 17, 0]]
    

    【讨论】:

    • 'width=40' 是什么?@blhsing
    • 这只是为了 pprint 格式化输出以使其可读,我使用 40 的宽度使输出恰好适合给定的列表。如果没有pprint,如果使用print,则输出将是列表的一长行。
    【解决方案2】:

    让s中选中的子列表被称为lst
    首先计算lsti的所有M[i]之和

    sum_ = [0]*len(M[0])
    for i in lst:
        sum_ += M[i]
    

    现在i 不在 lst

    for i in range(len(M)):
        if i in lst:
            if i == 0: continue
            for j in range(len(M[i])):
                M[i][j] += M[i-1][j]
        else:
            M[i] += sum_
    

    【讨论】:

    • 总和应该是 elementwise@SauravYadav
    • 是的,我编辑了代码。您可以根据您的要求修改它@H.S.
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多