Python list.remove()不起作用

时间:2017-01-09 18:50:20

标签: python regex list

我使用的是一个python文件commands.py     导入命令

该文件如下:

import datetime

def what_time_is_it():
    today = datetime.date.today()
    return(str(today))

def list_commands():
    all_commands = ('list_commands', 'what time is it')
    return(all_commands)

我希望主脚本列出commands.py中的函数,所以我使用的是dir(commands),它给出了输出:

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'datetime', 'list_commands', 'what_time_is_it']

然后我尝试使用正则表达式删除包含'__'的项目,如下所示:

commands_list = dir(commands)
for com in commands_list:
   if re.match('__.+__', com):
      commands_list.remove(com)
   else:
      pass

这不起作用。如果我在没有for循环或正则表达式的情况下尝试这样做,它声称该条目(我刚从print(list)复制并粘贴的列表不在列表中。

作为第二个问题,我可以让dir只列出函数,而不是'datetime'吗?

4 个答案:

答案 0 :(得分:5)

您在迭代时无法修改列表,而是使用列表推导:

commands_list = dir(commands)
commands_list = [com for com in commands_list if not re.match('__.+__', com)]

作为第二个问题,您可以使用callable检查变量是否可调用。

答案 1 :(得分:4)

我会在这里使用列表组合:

commands_list = [cmd for cmd in commands_list if not (cmd.startswith('__') and cmd.endswith('__'))]

答案 2 :(得分:1)

使用list comprehension,试试这个:

[item for item in my_list if '__' not in (item[:2], item[-2:])]

<强>输出:

>>> [item for item in my_list if '__' not in (item[:2], item[-2:])]
['datetime', 'list_commands', 'what_time_is_it']

使用filter()

可以获得相同的结果
filter(lambda item: '__' not in (item[:2], item[-2:]), my_list)  # list(filter(...)) for Python 3

答案 3 :(得分:0)

您可以filter列表:

commands_list = filter(lambda cmd: not re.match('__.+__', cmd), dir(commands))

这会过滤掉not与正则表达式匹配的所有项目。