我很惊讶在python中看到以下行为:
>>> x = ['A','F']
>>> print x
['A', 'F']
>>> x.remove('A')
>>> print x
['F']
>>> ['A','F'].remove('A')
>>> print ['A','F'].remove('A')
None
前四个命令显示.remove()
的预期操作。但是,在最后两个命令中,似乎remove函数的返回值是None
而不是修改后的列表,这对我来说很奇怪。
我想做类似的事情:
list1 = ['a','b','c']
list2 = []
list2.append(list1.remove('a'))
print list2 # returns [None] instead of [['a','b']]
我能做到:
list2.append([x for x in list1 if x != 'a'])
但在我看来,这更难阅读/理解。还有更好的方法吗?
答案 0 :(得分:2)
删除操作就位 - 它修改了执行操作的列表,而不是返回新列表。没有真正需要返回“修改”列表,因为调用列表删除仍然可用。
预计mockBeanFactory.getType(CLASS_NAME);
expectLastCall().andReturn(SOME_CLASS);
打印print list.remove(x)
。
出了什么问题:
None
您是否只是想减少代码行?
答案 1 :(得分:0)
如果您不喜欢使用追加列表推导,
list2.append([x for x in list1 if x != 'a'])
然后我建议将它分成几行,以便于阅读。
new_list = [x for x in list1 if x != 'a']
list2.append(new_list)
或者,如果您发现列表理解难以理解,您只需复制列表然后删除您不想要的元素。
list1 = ['a', 'b', 'c']
new_list = list(list1) # copy the entire list
new_list.remove('a')
list2.append(a)
答案 2 :(得分:0)
index(item)
返回项目出现的列表中的最低索引
remove
删除找到的第一个项目,因此我们可以使用slice with index
在一行中获得相同结果而不更改list1
:
list1 = ['a','b','c']
list2 = []
index = list1.index('a')
list2.append(list1[:index] + list1[index+1:])
print list2