Python列表删除循环中的项目一次

时间:2014-07-26 13:08:59

标签: python list loops

我需要以下列方式输入用户,

abc item1 item2
abc item3 item4
pqr item2 item3
456 item1 item1
abc
>>> Invalid Input
123 item2 item5
... ..... .....
789

基本上用户可以输入以abc开头的行,但在任何其他行以pqr或456或123开头之前。如果用户在其他行之后输入abc,则应将其视为无效输入,输入将在用户输出时终止将进入789。

这是我的代码,

    COMMANDS = ['abc','pqr', '123', '456', '789']

    INPUT = []
    for ROW in iter(raw_input, COMMANDS[4]):
      ROW = ROW.split()
      if len(INPUT) == 0:
        if ROW[0] == COMMANDS[0]:
          INPUT.append(ROW)
        else:
          print '>>> Invalid Input'
      elif ROW[0] == COMMANDS[0]:
        INPUT.append(ROW)
      elif ROW[0] in COMMANDS[1:]:
        COMMANDS = COMMANDS[1:]
        INPUT.append(ROW)
      else:
        print '>>> Invalid Input'

    print INPUT

我认为我的第二个elif语句有问题,在循环中它只是不断砍掉列表。我不知道如何使这个工作,请帮助。如果您认为有更好的方法来做我想做的事情,那么请建议。

以下是运行上述代码时的输出

    abc
    pqr
    abc
    >>> Invalid Input
    123
    345
    >>> Invalid Input
    456
    abc
    >>> Invalid Input
    pqr
    >>> Invalid Input
    789
    [['abc'], ['pqr'], ['123'], ['456']]

在输出中,您可以看到pqr被标记为无效输入,它不应该是,我认为在我的第二个efif我正在切断'abc'并且随着循环的进行,它也切断了'pqr'以及我不想要的清单。我只是想从列表中删除abc。

最后设法找到解决方法,

    COMMANDS = ['abc','pqr', '123', '456', '789']

    INPUT = []
    for ROW in iter(raw_input, COMMANDS[4]):
      ROW = ROW.split()
      if len(INPUT) == 0:
        if ROW[0] == COMMANDS[0]:
          INPUT.append(ROW)
        else:
          print '>>> Invalid Input'
      elif ROW[0] == COMMANDS[0]:
        INPUT.append(ROW)
      elif ROW[0] not in COMMANDS:
        print '>>> Invalid Input'
      else:
        try:
          COMMANDS.remove('abc')
        except ValueError, e:
          pass
        INPUT.append(ROW)

    print INPUT

这可能不是最好的方式,但现在为我工作。如果你有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:1)

试试这个:

commands = ['pqr', '123', '456', '789']
inp = []
user_inp = None
non_repeat = "abc"
while user_inp != "789":
    user_inp = raw_input()
    # if it is the first entry and input == non_repeat 
    if not inp and user_inp == non_repeat:
        inp.append(user_inp)
    # else if all entries so far are == non_repeat and currnet input == non_repeat
    elif user_inp == non_repeat and all(x == non_repeat for x in inp):
        inp.append(user_inp)
     # else if it is a valid command, append
    elif inp and user_inp in commands:
        inp.append(user_inp)
    # else we tried adding non_repeat after other elements or a command not in the list
    else:
        print ">>> Invalid Input"

您应该使用小写字母表示变量名称,同时在代码中添加注释可以帮助您查看正在发生的事情,并使人们更容易帮助您。