Python追加不按预期工作

时间:2016-06-26 21:33:36

标签: python python-2.7

x_list = [0, 0]
y_list = [0, 1]
def coordinates(condition_x, condition_y):
    zipped = zip(x_list, y_list)
    condition_coord = condition_x,condition_y
    for a,b in zipped:
        print a,b
        coord = a,b
        if condition_coord != coord:
            x_list.append(condition_x)
            y_list.append(condition_y)
        else:
            print "Already a room there"

print x_list
print y_list    
coordinates(0,1)
print x_list
print y_list

对于此代码,我想要完成的是:有两个列表x_listy_list,我正在检查是否已有任何坐标对那里。 x_listy_list的第一个索引是第一个坐标,它们的第二个索引是第二个坐标等。

coordinates函数中,我想查看两个列表,并测试是否已存在该坐标,如果没有,则将其附加到2个列表,创建另一个坐标对。

我得到的错误是在它经过测试的时候,它说两个"已经是一个房间"并将坐标附加到列表中,即使它们已经存在。

示例:

coordindates(0,1)
coordindates(0,2)

应该返回"已经是那里的房间"第一次调用时,将0添加到X_list,将第2次添加到y_list。

4 个答案:

答案 0 :(得分:1)

您的代码无法使用,因为您为每对执行了检查并添加。因此,如果您有N个坐标,您将添加新坐标N次,如果已经存在,则添加N-1。你必须做这样的事情:

def coordinates(condition_x, condition_y):
    zipped = zip(x_list, y_list)
    condition_coord = condition_x,condition_y
    in_lists = False

    for a,b in zipped:
        print a,b
        coord = a,b
        if condition_coord = coord:
            in_lists = True
            break

    if not in_lists:
        x_list.append(condition_x)
        y_list.append(condition_y)

或更好,只需使用set元组:

>>> coordinates = {(5, 7), (9, 0), (0, 1)}
>>> coordinates
set([(0, 1), (9, 0), (5, 7)])
>>> coordinates.add((5, 7))
>>> coordinates
set([(0, 1), (9, 0), (5, 7)])
>>> coordinates.add((4, 4))
>>> coordinates
set([(0, 1), (9, 0), (5, 7), (4, 4)])

答案 1 :(得分:1)

问题是您只是检查一个坐标是否与您的condition coord不匹配。您仍然可以搜索,但更好的方法是利用Python的in

x_list = [0, 0]
y_list = [0, 1]

def coordinates(condition_x, condition_y):
    if (condition_x, condition_y) not in zip(x_list, y_list):
        x_list.append(condition_x)
        y_list.append(condition_y)
    else:
        print 'Already a room there'

print x_list
print y_list    
coordinates(0, 1)
print x_list
print y_list

更好的方法是使用set

答案 2 :(得分:0)

在执行for循环压缩x_list, y_list之后,您的代码将被修改为更新坐标,以下内容已修改为带有注释的循环:

match = False
for a,b in zipped:
        print a,b
        coord = a,b
        if condition_coord == coord: # coord matched
           match = True # set match flag and break for loop, no reason to continue
           break

if not match: # if match Falsy we have to update x_list and y_list
    x_list.append(condition_x)
    y_list.append(condition_y)
else:
    print "Already a room there"

coordinates方法的替代版本:

def coordinates(cond_x, cond_y):
    if (cond_x, cond_y) not in zip(x_list, y_list):
        x_list.append(cond_x)
        y_list.append(cond_y)
    else:
        print "Already there"

答案 3 :(得分:0)

您应该使用更好的测试条件。因此,当至少一个测试通过时,您的条件会添加一个新坐标,而应该在所有坐标都通过测试时添加。您应该使用all

x_list = [0, 0]
y_list = [0, 1]

def coordinates(condition_x, condition_y):
    zipped = zip(x_list, y_list)
    condition_coord = condition_x,condition_y
    #if all((a, b) != condition_coord for a, b in zipped):
    if condition_coord not in zipped:
        x_list.append(condition_x)
        y_list.append(condition_y)
    else:
        print "Already a room there"