Он не осуществляет массив transpuesta в Пайтоне

Если я делаю массив, он не позволяет мне делать transpuesta, но если уже у меня есть пустой массив, если он делает меня transpuesta.

def TranspuMa (массив):

if ValidaMatrices(matriz) == False:
    return "No es una matriz"

else:
    NM = [[0]]
    M2 = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    while len(matriz[0]) != len(NM[0]):
        NM[0] += [0]
    while range(len(matriz)) != range(len(NM)):
        NM += [NM[0]]
    x = -1
    y = -1

    for i in range(3):
        x+=1
        for j in range(3):
            y+=1
            M = matriz[i][j]
            NM[y][x] = M


        y = -1



    print(M2)
    print(NM)
1
задан 21.03.2019, 23:54
1 ответ

Рассуждения

Я Верю в то, что, если хочет массив transpuesta , podrГ, - чтобы относиться друг к другу о двух формах:

  1. Посредством одной funciГіn anГіnima (он включается, чтобы дополнять вопрос)
  2. Повторяя на ячейках из массива, к чему могут приступать трех способов:

    2.1. Используя циклы while укрытых

    2.2. Используя цикл for укрытых

    2.3. Используя ее compresiГіn укрытых списков

, Как не предоставлялась она funciГіn ValidaMatrices, я буду принимать, что estГЎ вводя правильный массив в компьютер без необходимости быть выданной счастьем funciГіn.

1) FunciГіn AnГіnima

Para создавать счастье funciГіn, требуется оператора (*) и функций zip, list и map.

В continuaciГіn имеет по отношению к себе следующий массив: matriz=[[1,2],[3,4],[5,6]], transpuesta которых [[1, 3, 5], [2, 4, 6]]

print zip(*matriz) 
#[(1, 3, 5), (2, 4, 6)]

На первый взгляд, ценит в себе, что funciГіn zip берет элементы каждого списка или линии и группирует их первые с первыми и вторыми с секундами, также оператор (*) раскалывает на части (desempaca) линии массива до того, как zip к нему относится. AquГ - деталь:

fila1=[1,2]
fila2=[3,4]
fila3=[5,6]
print zip(fila1,fila2,fila3)
#[(1, 3, 5), (2, 4, 6)]

Наблюдать, что zip(*matriz) производит два tuplas или две линии, которых tuplas : (1, 3, 5),(2, 4, 6) в этом смысле, funciГіn list превращает tuplas в списки.

print list((1,3,5)), list((4,5,6)) 
#[1, 3, 5] [4, 5, 6]

Также посредством нее compresiГіn списков облегчает себе группировать снова tuplas преобразованных списки в соответствующем массиве.

print [list(i) for i in [(1, 3, 5), (2, 4, 6)]]
#[[1, 3, 5], [2, 4, 6]] 

print [list(i) for i in zip(*matriz)]
#[[1, 3, 5], [2, 4, 6]]

Adicionalmente Пайтона считает с нею funciГіn map , которая требует двух parГЎmetros:

 map(funcion, iterables)

Предыдущее может отображать в continuaciГіn

print map(list, [(1, 3, 5), (2, 4, 6)])     #[[1, 3, 5], [2, 4, 6]]
print map(list, zip(fila1,fila2,fila3))     #[[1, 3, 5], [2, 4, 6]]
print map(list, zip(*matriz))               #[[1, 3, 5], [2, 4, 6]]

Обобщая, corazГіn ее funciГіn anГіnima: map (list, zip (*matriz))

# Funcion anonima
mt = lambda m: map(list, zip(*m))

for r in mt(matriz): print(r)
# Se imprime:
# [1, 3, 5]
# [2, 4, 6]


2) Повторяя на ячейках

В continuaciГіn мы видим разработку mГЎs традиционный, чтобы получать transpuesta

Используя циклы while укрытых

# Empleando bucle while anidados
def TranspuMaV1(matriz):
    m=matriz

    nFil=len(m)
    nCol=len(m[0])

    # siendo i las filas y j las columnas
    mt=[]
    j=0
    while j<nCol:
        i=0
        mt.append([])

        while i<nFil:
            mt[j].append(m[i][j])
            i+=1

        j+=1

    return(mt)

Используя цикл for укрытых

# Empleando bucle for anidados
def TranspuMaV2(matriz):
    m=matriz

    nFil=len(m)
    nCol=len(m[0])

    # siendo i las filas y j las columnas
    mt=[]

    for j in range(nCol):
        mt.append([])
        for i in range(nFil):
            mt[j].append(m[i][j])

    return(mt)

Используя ее compresiГіn укрытых списков

# Empleando la compresión lista anidada
def TranspuMaV3(matriz):
    m=matriz

    nFil=len(m)
    nCol=len(m[0])

    # siendo i las filas y j las columnas
    mt=[[m[i][j] for i in range(nFil)] for j in range(nCol)]

    return(mt)

Тестируя три альтернативы

# Pruebas       
matriz=[[1,2],
        [3,4],
        [5,6]]


for r in TranspuMaV1(matriz): print(r)
print()
for r in TranspuMaV2(matriz): print(r)
print()
for r in TranspuMaV3(matriz): print(r)

# Se imprime:
# [1, 3, 5]
# [2, 4, 6]

# [1, 3, 5]
# [2, 4, 6]

# [1, 3, 5]
# [2, 4, 6]

Также я предлагаю, чтобы проверил структура данных в Пайтон , чтобы видеть в детали cГіmo, функционируй list.append. Adicionalmente в ВїAlguien может объяснять мне, что quГ© он делает этот cГіdigo? detallГ©, поскольку индексируются списки в Пайтон , и я объясняю, что quГ© он делает mГ©todo list.append

В конце концов, despuГ©s ее acotaciГіn предыдущий, nГіtese, что, чтобы создавать каждую линию в массиве transpuesta, вводит пустой список [] в mt с mГ©todo append, кроме в третьем предложении.

Замечает: В этом случае предстали перед вариантами, чтобы решать попросившее, тем не менее, ни одна Г©stas, она была подчинена результатам ejecuciГіn, - например в массивах 1000x1000 , - в этом смысле, я считаю, что это, уже он убегает в начальный вопрос, не осведомившись об алгоритмах, которые относились бы к предыдущему.

1
ответ дан 02.12.2019, 05:18