2015-06-10 36 views
1

我有一个字符串stringlist = ["elementOne" , "elementTwo" , "elementThree"]的名单,我想搜索包含"Two"串并删除从列表中的元素,所以我的列表将成为stringlist = ["elementOne" , "elementThree"]查找并删除列表中的元素,如果匹配的字符串

我管理打印他们,但真的不知道如何使用del,因为我不知道该索引列表或使用stringlist.remove("elementTwo")完全删除,因为我不知道含"Two"

我的代码元素的确切字符串到目前为止:

for x in stringlist: 
    if "Two" in x: 
     print(x) 

回答

1

通常,当我们执行列表理解,我们建立了一个新的列表,并分配给它的同名遗憾作为旧名单。虽然这会得到期望的结果,但这不会删除旧的列表。

为了确保引用保持不变,则必须使用此:

>>> stringlist[:] = [x for x in stringlist if "Two" not in x] 
>>> stringlist 
['elementOne', 'elementThree'] 

优点:既然是分配给一个列表切片
将具有相同的内容替换Python列表对象,所以引用保持不变,从而防止其他地方引用的一些错误。

如果你这样做,你会失去对原始列表的引用。

>>> stringlist = [x for x in stringlist if "Two" not in x] 
>>> stringlist 
['elementOne', 'elementThree'] 

因此,为了保留引用,您需要构建列表对象并为其分配列表片段。

要了解的细微差别:

让我们以一个列表a1包含一些元素,并指定列表a2等于a1

>>> a1 = [1,2,3,4] 
>>> a2 = a1 

方法1:

>>> a1 = [x for x in a1 if x<2] 

>>> a1 
[1] 
>>> a2 
[1,2,3,4] 

方法2:

>>> a1[:] = [x for x in a1 if x<2] 

>>> a1 
[1] 
>>> a2 
[1] 

方法-2其实是将原来的a1列表,而方法-1确实的内容不。

1

您可以使用enumerate当你遍历列表以获得指数(但请注意,这不是修改列表在遍历它一个Python的和安全的方式):

>>> for i,x in enumerate(stringlist): 
... if "Two" in x: 
...  print(x) 
...  del stringlist[i] 
... 
elementTwo 
>>> stringlist 
['elementOne', 'elementThree'] 

但作为你可以用一个列表理解保留不适用的元素更优雅和Python的方式包含Two

>>> stringlist = [i for i in stringlist if not "Two" in i] 
>>> stringlist 
['elementOne', 'elementThree'] 
+1

通常修改正在迭代的列表是个不错的主意。这是不同的,因为你使用枚举()? –

+0

@TimCastelijns好的,你注意到了这一点,是的,它实际上并不安全,并且它没有任何区别,使用'enumerate'或不! – Kasramvd

0

这样做会帮助你

for i,x in enumerate(stringlist): 
    if "Two" in x: 
     del stringlist[i] 

newList = [] 
for x in stringlist: 
    if "Two" in x: 
     continue 
    else 
     newList.append(x) 
-1

嗯,这是非常简单 - 所有的麻烦

for x in stringlist: 
    if "Two" in x: 
     stringlist.remove(x) 
+1

不要这样做。修改正在迭代的列表会产生奇怪的结果和错误 –

+0

你说得对,我已经在2k元素列表上做了这件事,发现即使它删除了大部分包含“Two”字符串的元素,我仍然发现4个元素“不知何故”跳过了删除。仍试图找出最佳解决方案。我会及时向大家发布。谢谢! – faceoff

相关问题