2013-02-19 78 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