Определение первого элемента списка списков в Python - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть школьное задание, и поэтому мы должны использовать PyCharm и следовать стандартам PEP8 и Google относительно Python3.Хотя мой код работает отлично, PyCharm утверждает, что индекс row [0] имеет неожиданное значение.

def create_matrix():
"""
    Function made to create a matrix of who wins or who loses based on the number of figures in a game.
    Keep in mind the order of the figures tuple. first element wins over second element, last element wins over
    first element. an element also wins against the element two steps before it, in the case of five elements.
    i haven't researched what relationships exist in higher dimensions, but there will always be an equal amount of
    elements who beat you, as elements you beat. the missing element will be a draw.
"""
figures = ("Scissors", "Paper", "Rock", "Lizard", "Spock")  # caution with order of elements
number_of_figures = len(figures)  # expected to be an odd number
half_set = number_of_figures // 2  # half_set = int((n-1)/2)

win_and_lose = [+1, -1]  # negative: row (player_b), positive: column (player_a), zero: draw
rows = [[None]*number_of_figures]*number_of_figures  # uses same size in memory as a "full" set

rows[0] = [0] + win_and_lose*half_set  # [0, -1, +1, -1, +1...]

for row in range(1, number_of_figures):
    rows[row] = rotate(rows[row-1], 1)

# for row in range(0, len(rows)):
#    print(rows[row])
return figures, rows

Linter warning

Я проверил изменение конкретной строки, которая дает мне предупреждение о ворсинке, до

    rows[0][0], rows[0][1], rows[0][2], rows[0][3], rows[0][4] = [0] + win_and_lose*half_set  # [0, -1, +1, -1, +1...]

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

    for column in range(0, number_of_figures):
    if column == 0:
        rows[0][column] = 0
    elif column % 2 == 0:
        rows[0][column] = +1
    elif column % 2 == 1:
        rows[0][column] = -1
    else:
        raise Exception("Unexpected column value")

, но у меня есть некоторые проблемы с этим:1) Он вообще не читается тем, кто хочет посмотреть код.2) Когда я пытаюсь напечатать список сейчас, он установил все строки на [0, -1, +1, +1, -1], а не только на первый элемент, как я ожидаю.Это не вызывает каких-либо ошибок во время выполнения, но это не то, что я хочу.

У меня вопрос, как я могу написать этот фрагмент кода на языке Python и легко читать, не нарушая никаких стандартов Python.

Бонусный вопрос: Я хочу минимизировать объем используемой памяти моего кода, и я видел через __sizeof __ (), что, если строки содержат пять элементов со значением None, он использует 80 байтов памяти,Тот же самый размер используется, если у меня есть пять элементов со значением [Нет, Нет, Нет, Нет, Нет].Размер остается неизменным, как только я установил некоторые значения для матрицы.Любые советы по этому поводу?Я настроил функцию rotate (), чтобы я мог вращать список на n позиций одновременно, чтобы я мог перейти к любой строке, в которой определена первая строка.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

PyCharm жалуется, потому что вы инициализируете rows как список списка None с, а затем повторно назначаете его как список списка int с.Независимо от того, это предупреждение о задержке, которое вы можете игнорировать, поскольку Python должен выполнять только динамическую типизацию (если вы хотите использовать статическую типизацию, пишите на статическом языке).

Вы можетеисправить это, просто инициализируя как:

rows = [[0 for _ in range(number_of_figures)] for _ in range(number_of_figures)]
# this is identical to `[[0] * number_of_figures] * number_of_figures` except it
# avoids the duplication of references issue you were experiencing that DYZ
# pointed out in the comments above.
0 голосов
/ 26 ноября 2018

Предполагая, что комментарий DYZ выше не существует в первом решении, вы можете использовать подсказку типа , чтобы помочь линтеру понять тип строк.В моем коде это исключает предупреждение linter.

rows = [[None]*number_of_figures]*number_of_figures  # type: list #uses same size in memory as a "full" set

Этот синтаксис также доступен для python 3:

rows:list = [[None]*number_of_figures]*number_of_figures
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...