Выбор списка Python при определенных условиях? - PullRequest
0 голосов
/ 18 октября 2018

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], то операция должна быть

  • 1stряд М без изменений
  • 2-й М = 1-й ряд М + 2-й ряд М
  • 3-й ряд М = 3-й ряд М + (1-й ряд М + 2-й ряд М)
  • и для оставшегося r-го ряда = r-й ряд M + (1-й ряд M + 2-й ряд M + 3-й ряд M + 3-й ряд M), r = 4,5, 6,7

, если выбран s [2], то операция должна быть

  • 4-я строка М без изменений
  • 5-я М =4-й ряд М + 5-й ряд М
  • и для оставшегося r-го ряда = r-й ряд М + (4-й ряд М + 5-й ряд М), 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]

После этого я не могу понять, как сделать все остальное.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Пусть выбранный подсписок из s будет называться lst
Сначала вычислите сумму всех M[i] для i в lst

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_
0 голосов
/ 18 октября 2018

Следующее будет выводить результаты для всех четырех подсписков 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]]
...