在 Python 中定义列表列表的第一个元素

马尊基

我有一个学校作业,因此我们需要使用 PyCharm 并遵循有关 Python3 的 PEP8 和 Google 标准。虽然我的代码运行良好,但 PyCharm 声称行 [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

短绒警告

我已测试更改特定行,该行向我发出 lint 警告

    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...]

并且代码可以在没有任何 lint 警告的情况下工作。我的问题是我希望元组的大小可以扩展。我知道我可以用 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 个位置,因此我可以跳到定义了第一行的任何给定行。

蜀山

假设上面 DYZ 的注释在第一个解决方案中不存在,您可以使用类型提示来帮助 linter 理解行的类型。在我的代码中,这消除了 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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python-如何替换列表列表中每个列表的第一个元素

匹配python中两个列表列表之间的第一个元素

在Python的列表列表中查找第一个元素的总和

获取 Python 列表列表中第一个元素的索引

Python-根据内部列表的第一个元素对列表列表中的元素求和

Python:嵌套列表中的第一个元素

Python:如何按最常见的第一个元素对列表列表进行排序?

如何在Python的列表列表中返回第一个非负列表的索引?

如何从python列表中的每个列表中拉出第一个元素?

通过比较第一个元素 Python 连接列表中的列表

Python如何通过知道列表中列表的第一个元素来获取列表中列表的索引?

遍历Python列表,但第一个元素在末尾?

更改每组 Python 列表的第一个元素

删除列表元素,直到到达Python中的第一个空元素

迭代Python列表中的连续元素,以使最后一个元素与第一个元素结合

当第一个元素大于下一个元素时,减去列表中的连续元素-Python

如何在Python中匹配两个不同列表的第一个元素

从python3中的列表中检索第一个元素的最pythonic方法

如果子列表的第一个元素在Python中是唯一的,则从第一个子列表获取前两项

Python根据子列表中的第一个元素将列表拆分为子列表

获取子列表的第一个元素作为python中的字典键

Python如何获取二维列表中的每个第一个元素

获取Python列表中每个元组的第一个元素

Python从列表中删除元组的第一个元素

Python中的列表仅避免第一个否定元素

通过python中的第一个元素重新组合子列表

如何获取python列表中的第一个元素并检查它是否为None?

第一个元素在python列表理解中不正确

如何在python中搜索列表的第一个元素