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,代码与原始代码匹配,具有可比较的编辑,因此这很好。