文字列にPythonで指定された特定の文字のみが含まれているかどうかを確認する最も簡単な方法は何ですか? (もちろん、正規表現などを使用せずに)
具体的には、文字列のリストがあり、別の文字列の文字のみで構成されている単語を除いて、それらすべてを除外したいと考えています。たとえば、フィルタリングする['aba', 'acba', 'caz']
と. (入っていません)'abc'
['aba', 'acba']
z
abc
与えられた文字で作れるアイテムだけを残すようなもの。
あなたの例の不一致がタイプミスであると仮定すると、これはうまくいくはずです:
my_list = ['aba', 'acba', 'caz']
result = [s for s in my_list if not s.strip('abc')]
になります['aba', 'acba']
。 string.strip(characters)は、削除される文字列に入力に文字しか含まれていない場合、空の文字列を返します。文字の順序は重要ではありません。
セットを利用できます:
>>> l = ['aba', 'acba', 'caz']
>>> s = set('abc')
>>> [item for item in l if not set(item).difference(s)]
['aba', 'acba']
検索文字列内の文字のみを含むリスト内の文字列のみが必要であると仮定すると、簡単に実行できます
>>> 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']
このようなもの:
strings = ['aba', 'acba', 'caz']
given = "abc"
filter(lambda string: all(char in given for char in string), strings)
ベース文字列の文字を再利用することについて、質問はややあいまいです。または、繰り返しがあるべきかどうか、または欠落した文字が許可されているかどうか。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']
以下はコードです:
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