2013-02-19 44 views
4

爲什麼以下語句在Python中不返回沒有'item'的列表?從Python中的未命名列表中刪除項目

list(something_convertible_to_list).remove('item') 

我想用上面的結構,以避免明確命名列表它傳遞給函數的唯一目的,即:

operate_on_list(list(something_convertible_to_list).remove('item')) 

def operate_on_list(my_list): 
    # do_something 
    print my_list 
    return 

這是可能在Python?

回答

9

在python中,內置方法返回None,使其絕對清除它們突變了一個對象。

當然,你完全可以忽略此約定,寫自己的包裝:

def my_remove(lst,what): 
    lst.remove(what) 
    return lst 

但我不會推薦它。

作爲一個側面說明,如果你想要做的事,如:

list(something_convertible_to_list).remove('item') 

,但得到的名單後面,下面可能是相似,足以有用:

[x for x in something_iterable if x != 'item'] 

是否會返回一個列表,但其中list.remove只會帶走1 'item',這會構建一個沒有'item'的新列表。

+0

謝謝。這非常有幫助。我認爲沒有其他可以用於此目的的內置列表(即,我唯一的,簡單的替代方法是定義我自己的列表方法)。是對的嗎? – 2013-02-19 15:26:57

+0

@ user273158 - 查看我的編輯。 – mgilson 2013-02-19 15:28:21

+0

@Nicolas - 謝謝。正如你所評論的那樣,我正在努力。偉大的頭腦必須想象:) – mgilson 2013-02-19 15:29:49

1

你可以嘗試這樣的:

my_list[:my_list.index('item')]+my_list[my_list.index('item')+1:] 

雖然你們的確有兩個搜索在這裏。

[item for item in my_sequence if item != 'item'] 

第一個將從列表中刪除所述第一'item',而第二個將刪除每'item'

+0

值得指出的是,在列表中有多個「item」的情況下,這兩個陳述並不相同。 – mgilson 2013-02-19 15:30:27

+0

另外值得指出的是,要使用你的第一個答案,你需要一個以(或至少一個序列)開頭的列表,並且它必須已經綁定到本地名稱空間中的一個名稱 - 不僅僅是你可以用它來構造一個列表。 – mgilson 2013-02-19 15:38:19

+0

我認爲'my_list'部分幾乎可以解釋, – dmg 2013-02-19 15:39:45