Python 代码抛出类型错误:不支持的操作数类型为-:';int';和';列表';
该代码是定位算法的实现:Python 代码抛出类型错误:不支持的操作数类型为-:';int';和';列表';,python,typeerror,Python,Typeerror,该代码是定位算法的实现: colors = [['red', 'green', 'green', 'red' , 'red'], ['red', 'red', 'green', 'red', 'red'], ['red', 'red', 'green', 'green', 'red'], ['red', 'red', 'red', 'red', 'red']] motions = [[0,0],[0,1],[1,0],[1,0],[
colors = [['red', 'green', 'green', 'red' , 'red'],
['red', 'red', 'green', 'red', 'red'],
['red', 'red', 'green', 'green', 'red'],
['red', 'red', 'red', 'red', 'red']]
motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
p_move = 0.8
def show(p):
for i in range(len(p)):
print p[i]
p = []
sum=0
for i in range(len(colors)):
for j in range(len(colors[i])):
sum+=1
p=[[1.0/sum for j in range(len(colors[i]))] for i in range(len(colors))]
def move(lst,u=[]):
q=[]
if (u[0]!=0) :
for i in range(len(lst)):
new=[]
for j in range(len(lst[i])):
val=lst[j-u][i]*p_move
new.append(val)
q.append(new)
elif (u[1]!=0) :
for i in range(len(lst)):
new=[]
for j in range(len(lst[i])):
val=lst[i][j-u]*p_move
new.append(val)
q.append(new)
return q
a=[[0 for i in range(len(colors[j]))] for j in range(len(colors))]
for i in range(len(motions)):
a=move(p,motions[i])
show(p)
上述代码抛出问题中为以下语句指定的TypeError
:
val=lst[i][j-u]*p_move
请告诉我为什么会这样。我是python新手,看不出编译器为什么会抛出这个错误。
此外,我正在尝试根据运动
列表中的列表中的值更改列和行中的值。我试图实现这一目标的方式正确吗
编辑
许多人要求了解该准则的目的。我将重复我在问题的评论部分提到的内容:它是用于实现本地化算法的代码的一部分。这部分代码用于计算移动的概率。移动到所需单元的成功概率为p_move=0.8。如果设备被命令移动到某个单元,则给定单元的先前概率乘以该值
但是,一位评论员要求的示例输出需要包含代码的另一部分,这将需要进一步解释并进一步混淆目的。这是对代码的推测性改进。和其他很多人一样,我不明白你想做什么。此外,在
move
中设置索引也需要详细说明。大概是u
中的某个值
from pprint import pprint
colors = [
['red', 'green', 'green', 'red' , 'red'],
['red', 'red', 'green', 'red', 'red'],
['red', 'red', 'green', 'green', 'red'],
['red', 'red', 'red', 'red', 'red']
]
motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
p_move = 0.8
def move(lst, u):
q = []
if u[0] != 0:
index = u[0]
for i, elem in enumerate(lst):
q.append([lst[j-index][i] * p_move] for j in range(len(elem)))
elif u[1] != 0:
index = u[1]
for i, elem in enumerate(lst):
q.append([lst[i][j-index] * p_move] for j in range(len(elem)))
return q
def main():
total = sum(len(c) for c in colors)
p = [[1.0 / total] * len(c) for c in colors]
a = [[0] * len(c) for c in colors]
for m in motions:
a = move(p, m)
pprint(p)
main()
我不确定我是否完全理解你想做什么@hughdbrown提供了许多改进,使代码保持原样,但我无法告诉您试图用代码实现什么,所以我想知道您是否在寻找不同的东西。 如果您希望根据“运动”列表中的运动更改特定值,则可以执行以下简单操作:
a = [[0]*len(c) for c in colors]
index = [sum(x) for x in zip(*motions)]
a[index[0]][index[1]] = p[index[0]][index[1]] * p_move
或者,如果您希望沿运动方向更改每个值,则发电机功能可以工作:
def move(motions):
index0, index1 = 0, 0
for m in motions:
index0 += m[0]
index1 += m[1]
yield (index0,index1)
motions = [[0,0],[0,1],[1,0],[1,0],[0,1]]
a = [[0]*len(c) for c in colors]
for row,col in move(motions):
a[row][col] = p[row][col]*p_move
show(motions)
show(p)
show(a)
输出:
[0, 0]
[0, 1]
[1, 0]
[1, 0]
[0, 1]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.05, 0.05, 0.05, 0.05, 0.05]
[0.04, 0.04, 0, 0, 0]
[0, 0.04, 0, 0, 0]
[0, 0.04, 0.04, 0, 0]
[0, 0, 0, 0, 0]
因为
u
是一个列表,而j
是一个整数,所以您正在将列表传递给您的函数。该死!我真是太蠢了。@sukrit你为什么不把这个贴出来作为答案呢?因为,我不能回答你的第二个问题p你在范围()上做了大量的循环。
;只需循环列表本身即可<代码>对于范围内的i(len(lst)):可以替换为对于lst中的elem:
,将循环中的所有lst[i]
引用替换为elem
。对于我来说,不清楚您试图用代码做什么。你想在问题中给出一个预期输出的例子吗?陈述是什么:`i,elem in enumerate(lst)在做什么?详细说明索引
,对于各自的条件,它应该是u[0]和u[1]。enumerate
给你一个索引和列表中的一个元素。请参见此处:更新为基于u
设置索引。仍然不清楚计算意味着什么。OTOH,代码与原始代码匹配,具有可比较的编辑,因此这很好。