2017-01-09 54 views
1

我包括使用 進口Python文件commands.py命令Python的list.remove()不工作

文件如下:

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循環或正則表達式的情況下執行此操作,它聲稱該條目(我剛剛從打印(列表)中複製並粘貼的條目不在列表中。

作爲第二個問題,我可以獲得目錄只列出的功能,而不是「日期時間」,以及

+2

無需'regex'我不要想。 'new_lst = [如果'__'不在項目中,則爲lst中的項目]' – roganjosh

+1

我會在這裏使用列表理解。如果不是(i.startswith('__')and i.endswith('__'))]' –

回答

5

當你迭代它不能修改的列表,改用列表理解:

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

作爲第二個問題,您可以使用callable來檢查變量是否可調用。

+0

就對了。這是實際的問題。 – jszakmeister

+0

工作,謝謝。關於'callable',''''callable(commands.what_time_is_it)''''返回true,所以我嘗試了下面的命令: 'command_list = [com for com in commands_list if(not re.match('__ 。+ __',com)和callable('commands。'+ com))]'''' 這是行不通的,因爲''''''''''''''''''即使''''callable(commands.what_time_is_it)''''返回true,''''= what_time_is_it''''也會返回false。 – Alex

+0

@Alex這是因爲你傳遞給它一個字符串,你必須像這樣傳遞對象:'callable(getattr(commands,com))' –

4

我只想用一個列表比較here:在

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

可以filter名單:

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

這過濾掉那些not匹配正則表達式的所有項目。

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