リスト内の文字のみを使用して文字列を作成できるかどうかを確認したいと思います。例えば、
>>>acceptableChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>>print isAcceptable("abc")
True
>>>print isAcceptable("xyz")
False
リスト内の文字のみを使用して文字列を作成できるかどうかを確認したいと思います。例えば、
>>>acceptableChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>>print isAcceptable("abc")
True
>>>print isAcceptable("xyz")
False
からセットを作成しacceptableChars
ます:
>>> acceptableChars = set('abcdefghi')
acceptableChars
これで、引数の文字のいずれかがセット減算を使用していないかどうかをisAcceptableチェックすることができます。
>>> def isAcceptable(s):
return set(s) <= acceptableChars
>>> isAcceptable("abc")
True
>>> isAcceptable("xyz")
False
実際のユースケースは次のとおりです。
私はこれを使用して、何かがハッシュ(0-9、af)であるかどうかを確認しているので、任意の数の重複が許容されます
これはどう:
intvalue = int(possiblehash, 16)
これが成功した場合、それは有効な16進文字列であり、必要な場合に備えて値があります。例外が発生した場合、それは有効な16進文字列ではありませんでした。それで:
try:
intvalue = int(possiblehash, 16)
except Exception as e:
print("That's not a hex string! Python says " + str(e))
別の方法を使用して16進文字列を整数ではなく適切な形式に変換する場合は、まったく同じ考え方が適用されます。
try:
binvalue = binascii.unhexlify(possiblehash)
except Exception as e:
print("That's not a hex string! Python says " + str(e))
def isAcceptable(text, acceptableChars=set("abcdefghi")):
return all(char in acceptableChars for char in text)
1つの可能性は、文字列をループすることです。
def isAcceptable(s):
for c in s:
if not isAcceptableChar(c):
return False
return True
isAcceptableChar
関数の書き方はかなり明白なはずです。
もちろん、Pythonについてもう少し知っている場合は、おそらく次のように書くだけです。
def isAcceptable(s):
return all(isAcceptableChar(c) for c in s)
そして、集合論について少し知っていれば、おそらくより効率的で単純な実装を思い付くことができます。
しかし、最初に基本的なものを機能させてから、それを改善する方法を考えてください。
In [52]: all(c in acceptableChars and acceptableChars.count(c)==want.count(c) for c in want)
Out[52]: True
In [53]: acceptableChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
In [54]: want = 'abc'
In [55]: all(c in acceptableChars and acceptableChars.count(c)==want.count(c) for c in want)
Out[55]: True
In [56]: want = 'xyz'
In [57]: all(c in acceptableChars and acceptableChars.count(c)==want.count(c) for c in want)
Out[57]: False
ただし、これを行うには、次の方がはるかに優れた方法です。
def isAcceptable(text, chars):
store = collections.Counter(chars)
for char in text:
if char not in store or not store[char]:
return False
store[char] -= 1
return True
私が考えることができる最も簡単な方法:yourString.strip('all your acceptable chars')
空白の文字列を返すかどうかを確認します。
def isAcceptable(text, acceptable='abcdefghi'):
return text.strip(acceptable) == ''
strip
が返される場合は''
、の文字のみも含まtext
れacceptable
ていました。