0

リスト内の文字のみを使用して文字列を作成できるかどうかを確認したいと思います。例えば、

>>>acceptableChars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>>print isAcceptable("abc")
True
>>>print isAcceptable("xyz")
False
4

6 に答える 6

4

からセットを作成しacceptableCharsます:

>>> acceptableChars = set('abcdefghi')

acceptableCharsこれで、引数の文字のいずれかがセット減算を使用していないかどうかをisAcceptableチェックすることができます。

>>> def isAcceptable(s):
    return set(s) <= acceptableChars
>>> isAcceptable("abc")
True
>>> isAcceptable("xyz")
False
于 2012-12-12T21:49:57.977 に答える
3

実際のユースケースは次のとおりです。

私はこれを使用して、何かがハッシュ(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))
于 2012-12-12T22:07:10.677 に答える
2
def isAcceptable(text, acceptableChars=set("abcdefghi")):
    return all(char in acceptableChars for char in text)
于 2012-12-12T21:49:59.370 に答える
0

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)

そして、集合論について少し知っていれば、おそらくより効率的で単純な実装を思い付くことができます。

しかし、最初に基本的なものを機能させてから、それを改善する方法を考えてください。

于 2012-12-12T21:50:07.973 に答える
0
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
于 2012-12-12T21:50:21.497 に答える
0

私が考えることができる最も簡単な方法:yourString.strip('all your acceptable chars')空白の文字列を返すかどうかを確認します。

def isAcceptable(text, acceptable='abcdefghi'):
    return text.strip(acceptable) == ''

stripが返される場合は''、の文字​​のみも含まtextacceptableていました。

于 2012-12-12T21:52:26.683 に答える