Filter list of strings using list comprehension
1 2 3 4
| >>> li = ["a b self","mpilgrim","foo c","b","c","b","d","d"]
>>> condition = ["b","c","d"]
>>> [elem for elem in li if elem in condition]
['b', 'c', 'b', 'd', 'd'] |
但是有返回的方法吗
1
| ['a b self','foo c','b', 'c', 'b', 'd', 'd'] |
号
由于b和c包含在'a b self'和'foo c'中,所以我希望代码也返回这两个值。
- 如果condition = ['d', 'e', 'f']呢?你会说"e"和"f"包括在"a b self"和"foo c"中吗?
- @DSM不,我不会,我只是对空白之间的元素感兴趣
- 您是否需要担心condition中的条目有自己的空间?例如,您是否需要查找"a b"并希望在"a b self"而不是"a banana"中找到它?
- 不,那不是问题。在您的示例中,我将在"a b self"中查找"a"和"b",在"a bannana"中查找"a"。条件中的元素没有空格,它们都是非空格字符串(即单个单词)
- 谢谢,我想这意味着最新版本的伊莉莎的回答对你有用。
- 如果你在寻找表现,这个问题可能会让你感兴趣。
假设代码需要检索包含任何条件字符串的所有字符串:
1
| [elem for elem in li if any(c in elem for c in condition)] |
如果需要完全匹配某个条件:
1 2
| [elem for elem in li if
any(re.search('(^|\s){}(\s|$)'.format(c), elem) for c in condition)] |
号
编辑:这可以简化为一个预先定义的regex:
1 2 3
| predicate = re.compile('(^|\s)({})(\s|$)'.format('|'.join(condition)))
[elem for elem in li if predicate.search(elem)] |
- 回答不错,我喜欢
- ;-)我打算提议使用\b,如果我们要使用regex路由。
- 我意识到这会更精确:【elem表示li中的elem,如果有的话(elem.split()中的c表示条件中的c)】
- @Song0089,你说得对,分割方法更简单。)
- 是的,需要一个split。另外,regex联合比n不同的regexen更好。
- 或if set(elem.split()).intersection(condition)。但这并不能推广到条件也可能有空格的情况(尽管OP对这些不感兴趣)。
- 另外,您可以使用'\b'作为单词边界。
- @EricDuminil@dsm,\b不包括其他字符串吗?对于r'\ba\b',它是否也与'a.'匹配?
- 是的,会的。只有OP知道什么是期望的行为:)