如何以编程方式创建和移动列表

How to programmatically create and shift list

目前我的代码中有这个

up = [1, 0, 0, 0]
down = [0, 1, 0, 0]
left = [0, 0, 1, 0]
right = [0, 0, 0, 1]

我想添加另一个我需要知道的变量

up = [1, 0, 0, 0, 0]
down = [0, 1, 0, 0, 0]
left = [0, 0, 1, 0, 0]
right = [0, 0, 0, 1, 0]
a = [0, 0, 0, 0, 1]

而且我不确定我需要多少变量,或者我最终可能需要很多变量。

是否可以创建一个我需要的变量列表,然后循环遍历每个变量并执行此操作?

我不太确定如何解决这个问题。

向 python 中的列表添加值是通过 append() 或 extend() 完成的。将项目列表附加到列表会将新列表放在现有列表的末尾,而扩展列表会将扩展列表的每个新项目放在现有列表的底部。

例如,如果您不确定列表中最终还需要多少项目,您可以创建一个函数,用任意数量的元素扩展它们:

>>> up = [1, 0, 0, 0]
>>> down = [0, 1, 0, 0]
>>> left = [0, 0, 1, 0]
>>> right = [0, 0, 0, 1]
>>> def extend_list(list, items):
...     return list.extend(items)
...
>>> extend_list(up, [0])
>>> print(up)
[1, 0, 0, 0, 0]
>>> extend_list(down, [0,1])
>>> print(down)
[0, 1, 0, 0, 0, 1]

你正在做的事情叫做 "one-hot encoding",你可以很容易地做到这一点。 首先,为您的 "variables" 构建一个字典,但不要将每个都写成 [0,0,0,1],只需写下它们的索引即可。或者更好的是,使用索引列表来存储他们的名字:

mylist = ['up','down','left','right']

然后,定义一个函数,它接受该列表/字典和 "variable" 数字(实际上是该字典中的键,或列表中的项目)并输出正确的 "one-hot"编码:

def onehot(mylist, key):
    index = mylist.index(key)
    zeros = [0 for i in mylist]
    zeros[index] = 1
    return zeros

现在,如果您的列表如上所示,运行ning onehot(mylist, 'up') 将输出 [1,0,0,0]。如果您决定随时扩展该列表,您可以 运行 mylist.append('newname') 再一次,运行 我们的小帮手 - onehot(mylist, 'newname') 将输出 [0,0,0,0,1]

另一种实现方式是在单个列表理解中完成所有工作。查找索引可能代价高昂(它是 O(n)),因为必须逐个元素地搜索列表。将其减少到一次通过会稍微降低复杂性:

def onehot(mylist, key):
    return [int(i == key) for i in mylist]