检查字符串是否仅包含Python中的某些指定字符的最简单方法是什么? (当然,不使用RegEx或其他任何东西)
具体来说,我有一个stings列表,我想过滤掉所有这些,除了只由另一个字符串中的任何字母组成的单词。例如,通过['aba', 'acba', 'caz']
过滤'abc'
应该为['aba', 'acba']
。 (z
不在abc
)
就像只保留使用给定字母可以制作的物品一样。
答案 0 :(得分:12)
假设您的示例中的差异是拼写错误,那么这应该有效:
my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]
结果为['aba', 'acba']
。如果要删除的字符串只包含输入中的字符,string.strip(characters)将返回一个空字符串。角色的顺序无关紧要。
答案 1 :(得分:8)
您可以使用sets:
>>> l = ['aba', 'acba', 'caz']
>>> s = set('abc')
>>> [item for item in l if not set(item).difference(s)]
['aba', 'acba']
答案 2 :(得分: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']
答案 3 :(得分:4)
这样的事情:
strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda string: all(char in given for char in string), strings)
答案 4 :(得分: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']
答案 5 :(得分: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
答案 6 :(得分:0)
我认为你对regexp的不情愿并不是一个问题:
strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda value: re.match("^[" + given + "]$", value), strings)