7

检查字符串是否仅包含 Python 中某些指定字符的最简单方法是什么?(当然不使用 RegEx 或任何东西)

具体来说,我有一个字符串列表,我想过滤掉所有字符串,除了仅由另一个字符串中的任何字母组成的单词。例如,过滤['aba', 'acba', 'caz']虽然'abc'应该给出['aba', 'acba']. (z不在abc

就像只保留可以使用给定字母制作的物品一样。

4

7 回答 7

12

假设您的示例中的差异是一个错字,那么这应该有效:

my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]

结果['aba', 'acba']。 如果要剥离的字符串在输入中只包含字符,则string.strip(characters)将返回一个空字符串。字符的顺序应该无关紧要。

于 2013-09-09T09:22:51.580 回答
8

您可以使用集合

>>> l = ['aba', 'acba', 'caz']
>>> s = set('abc')
>>> [item for item in l if not set(item).difference(s)]
['aba', 'acba']
于 2013-09-09T09:19:09.303 回答
6

假设您只想要列表中只有搜索字符串中的字符的字符串,您可以轻松地执行

>>> hay = ['aba', 'acba', 'caz']
>>> needle = set('abc')
>>> [h for h in hay if not set(h) - needle]
['aba', 'acba']

如果你不想避免集合,你也可以使用str.translate. 在这种情况下,您将删除搜索字符串中的所有字符。

>>> needle = 'abc'
>>> [h for h in hay if not h.translate(None,needle)]
['aba', 'acba']
于 2013-09-09T09:19:37.867 回答
4

像这样的东西:

strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda string: all(char in given for char in string), strings)
于 2013-09-09T09:19:57.473 回答
1

关于重新使用基本字符串中的字母,这个问题有些模棱两可。或者是否应该或不应该重复,或者允许缺少字母。该解决方案使用包含reuse参数的函数解决了该问题:

from collections import Counter

def anagram_filter(data, base, reuse=True):
    if reuse: # all characters in objects in data are in base, count ignored
        base = set(base)
        return [d for d in data if not set(d).difference(base)]
    r = []
    cb = Counter(base)
    for d in data:
        for k, v in Counter(d).iteritems():
            if (k not in cb.keys()) or (v > cb[k]):
                break
        else:
            r.append(d)
    return r

用法:

>>> anagram_filter(['aba', 'acba', 'caz'], 'abc')
['aba', 'acba']
>>> anagram_filter(['aba', 'acba', 'caz'], 'abc', False)
[]
>>> anagram_filter(['aba', 'cba', 'caz'], 'abc', False)
['cba']
于 2013-09-09T09:37:19.803 回答
0

我会假设您不愿意使用正则表达式并不是真正的问题:

strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda value: re.match("^[" + given + "]$", value), strings)
于 2013-09-09T09:29:26.813 回答
0

下面是代码:

a = ['aba', 'acba', 'caz']
needle = 'abc'

def onlyNeedle(word):
    for letter in word:
        if letter not in needle:
            return False

    return True

a = filter(onlyNeedle, a)

print a
于 2013-09-09T09:23:24.667 回答