在字符串数组中搜索部分字符串

时间:2016-08-25 17:07:53

标签: python arrays python-3.x

在数组中搜索部分字符串然后从数组中删除该字符串的Pythonic / quick方法是什么?
(我可以通过一个简单的循环和IF IN来完成它并在循环中重建两个数组,询问是否有Pythonic方式/函数来执行此操作)

示例:

array = ['rule1','rule2','exception[type_a]','rule3','exception[type_b]']
res(,)=remove_exceptions(array,'exception')
print(res[0]) >>> ['rule1','rule2','rule3']
print(res[1]) >>> ['exception[type_a]','exception[type_b]']

5 个答案:

答案 0 :(得分:2)

>>> [x for x in array if 'exception' not in x]
['rule1', 'rule2', 'rule3']
>>> [x for x in array if 'exception' in x]
['exception[type_a]', 'exception[type_b]']

另请参阅:Python: split a list based on a condition?

答案 1 :(得分:1)

如果您想要分开您的项目,您可以通过一个循环并通过保留字典中的项目来实现:

>>> d = {}
>>> for i in array:
...     if 'exception' in i:
...         d.setdefault('exception', []).append(i)
...     else:
...         d.setdefault('other', []).append(i)
... 
>>> 
>>> d
{'exception': ['exception[type_a]', 'exception[type_b]'], 'other': ['rule1', 'rule2', 'rule3']}

您可以通过调用字典的值来访问分隔的项目:

>>> d.values()
[['exception[type_a]', 'exception[type_b]'], ['rule1', 'rule2', 'rule3']]

答案 2 :(得分:1)

说真的,只是使用一个for循环,你试图创建两个列表,这样一个理解就行不通(即到目前为止顶级解决方案迭代两次在同一个列表上。)

创建两个列表并有条件地附加到它们:

l1 = list()
l2 = list()
for i in array:
    l1.append(i) if 'exception' in i else l2.append(i)

print(l1)
['exception[type_a]', 'exception[type_b]']
print(l2)
['rule1', 'rule2', 'rule3']

答案 3 :(得分:0)

您可以使用带有filter功能的内置lambda来实现此目标:

>>> my_array = array = ['rule1','rule2','exception[type_a]','rule3','exception[type_b]']
>>> my_string = 'exception'
>>> filter(lambda x: my_string not in x, my_array)
['rule1', 'rule2', 'rule3']

答案 4 :(得分:0)

对于字符串列表array和要排除的事物target

列表理解工作:

result = [s for s in array if target not in s]

或者相同的生成器理解:

result = (s for s in array if target not in s)

in实际上是一个包含运算符,not in是反向的。)

或者,将filter() built-in与lambda:

一起使用
result = filter(lambda x: target not in x,
                array)

任何一个都返回一个新对象,而不是修改原始列表。列表推导返回一个列表,filter()返回一个生成器,但是如果你需要随机访问,你可以将调用包装在list()中。