如果在另一个列表中找到值,则不会附加Python列表

时间:2015-04-09 11:53:00

标签: python python-2.7

我有一些代码可以解析一些sql语句。 由于某种原因,cmd_ordered_list似乎只包含'更新'而不是所有其他语句。在我看来,这条线不能正常工作: if(cmd in def_ordered_list):。我错过了一些明显的东西吗?

sql_statements = {} 
sql_select = {'select': 'select, *, from, where, and'}
sql_delete = {'delete': 'delete, from, where, and'}
sql_update = {'update': 'update, index, set, where, and'}
sql_insert = {'insert': 'insert, into, source'}

sql_statements.update(sql_select)
sql_statements.update(sql_delete)
sql_statements.update(sql_update)
sql_statements.update(sql_insert)

cmd = "update index employees set col = 'Hello'"
cmd_list = cmd.split()
first_cmd = cmd_list[0] # update
def_ordered_list = sql_statements[first_cmd].split(",")
cmd_ordered_list = []

for cmd in cmd_list:
    if(cmd in def_ordered_list):
        cmd_ordered_list.append(cmd)

print def_ordered_list
print cmd_ordered_list # only contains 'update' ?? why?

1 个答案:

答案 0 :(得分:3)

您的输入包含空格:

>>> 'update, index, set, where, and'.split(',')
['update', ' index', ' set', ' where', ' and']

请注意indexsetwhereand之前的空格。在列表成员资格时,您从不考虑这些空格;你应该先剥掉那些。或者更好的是,不要将这些选项存储为字符串。

如果您在sql_statements映射中存储,则可以避免分割问题,并且作为额外奖励,会员资格测试方式比使用列表更快:

sql_statements = {
    'select': {'select', '*', 'from', 'where', 'and'},
    'delete': {'delete', 'from', 'where', 'and'},
    'update': {'update', 'index', 'set', 'where', 'and'},
    'insert': {'insert', 'into', 'source'},
}

创建有序列表就像这样简单:

cmd = "update index employees set col = 'Hello'"
cmd_list = cmd.split()
cmd_ordered_list = [s for s in cmd_list[] if s in sql_statements[cmd_list[0]]]