簡體   English   中英

在Python中定義列表列表的第一個元素

[英]Defining the first element of a list of lists in Python

我有一個學校的作業,因此我們需要使用PyCharm並遵守關於Python3的PEP8和Google標准。 雖然我的代碼運行良好,但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

短絨警告

我已經測試過更改特定行,這給了我一個警告

    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標准的情況下,以pythonic和易於閱讀的方式編寫這段代碼。

額外的問題:我想減少代碼的內存使用量,並且通過__sizeof __()看到,如果行包含五個值為None的元素,則它將使用80個字節的內存。 如果我有五個值為[None,None,None,None,None]的元素,則使用相同的大小。 一旦為矩陣設置了一些值,大小將保持不變。 有什么提示嗎? 我已經設置了rotate()函數,以便可以一次旋轉列表n個位置,因此我可以跳到定義了第一行的任何給定行。

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.

假設上面的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM