@pyblpovishaisa

Как поменять местами столбец и строку во вложенном списке python?

Пытаюсь написать свою версию 2048, но столкнулся с проблемой. Пытаюсь написать движение чисел вверх, для этого мне нужно отсортировать список по горизонтали так, чтобы слева стояли двойки, а дальше шли нули и поменять местами столбцы и строки, чтобы всё заработало. Перепробовал множество вариантов решения проблемы, но никак не могу решить её.

import pygame
import sys
import random

pygame.init()
SIZE_BLOCK = 100
MARGIN = 5
WIDTH = HEIGHT = SIZE_BLOCK * 4 + MARGIN * 5

BLACK = 0, 0, 0
RED = 255, 0, 0
GREEN = 0, 255, 0
WHITE = 255, 255, 255


def pretty_print(list):
    for j in list:
        print(j)
    print('-' * 25)


def left_sort_in_mas(list):
    # Подсчитываем количесво нулей в словаре
    zeroes_count = list.count(0)
    # Создаем словарь с количеством нулей zeroes_count
    zeroes_count_list = [0] * zeroes_count
    len_row = len(list)
    while zeroes_count_list != list[len_row - zeroes_count:]:
        first_zero_index = list.index(0)
        del list[first_zero_index]
        list.append(0)
    return list


# Функция возвращает индекс последнего элемента со значением number в списке row
def found_last_number(row, number):
    try:
        zero_index = row.index(number)
        number_count = row.count(number)
        iteration_count = 1
        while number_count != iteration_count:
            zero_index = row.index(number, zero_index + 1, len(row) - 1)
            iteration_count += 1
        return zero_index
    except ValueError:
        zero_index = -1
        return zero_index


screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('2048')

mas = [[0] * 4 for i in range(4)]


# Стараюсь создать в массиве множество двое, чтобы проверить логику игры. Решение, конечно, временное =)
def random_2():
    mas[random.randint(0, 3)][random.randint(0, 3)] = 2
    mas[random.randint(0, 3)][random.randint(0, 3)] = 2
    mas[random.randint(0, 3)][random.randint(0, 3)] = 2


random_2()
random_2()
random_2()
random_2()


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                for row in mas:
                    left_sort_in_mas(row)

            if event.key == pygame.K_RIGHT:
                for row in mas:
                    # Подсчет количества нулей
                    zeroes_count = row.count(0)
                    # Создаем список из количества нулей в row
                    zeroes_count_list = [0] * zeroes_count
                    # Пока эти списки не будут равный переносим нули влево
                    while zeroes_count_list != row[:zeroes_count]:
                        last_zero_index = found_last_number(row, 0)
                        if last_zero_index >= 0 or last_zero_index <= 3:
                            del row[last_zero_index]
                            row.insert(0, 0)
                            print(row)
                        else:
                            continue

            elif event.key == pygame.K_UP:
                mas_row_sorted = []
                print(mas)
                # Создаём новый список идентичный mas, но отсортированный
                for j in mas:
                    mas_row_sorted.append(left_sort_in_mas(j))

                print(mas_row_sorted)
                mas = [[0] * 4 for i in range(4)]

                # Не получается заменить столбец на колонку!!!
                # Деление на 2, поскольку заменяю сверху и снизу сразу
                for row in range(len(mas_row_sorted) // 2):
                    for column in range(len(mas_row_sorted)):
                        mas[row][column] = mas_row_sorted[column][row]
                        mas[column][row] = mas_row_sorted[row][column]

    for row in range(4):
        for col in range(4):
            x = col * SIZE_BLOCK + (col + 1) * MARGIN
            y = row * SIZE_BLOCK + (row + 1) * MARGIN
            pygame.draw.rect(screen, WHITE, (x, y, SIZE_BLOCK, SIZE_BLOCK))
            font = pygame.font.SysFont('stxingkai', 80)
            text_1 = font.render(str(mas[row][col]), True, BLACK)
            screen.blit(text_1, (x,  y))

    pygame.display.flip()
  • Вопрос задан
  • 1443 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Короче, если нужно транспонировать, то:
transposed_massive = list(map(list, zip(*massive)))


а если поворачивать, то
rotated_massive = list(map(list, zip(*massive[::-1])))


только ради Control, Alt и святого Del, не переопределяй list...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект