12

文字列/単語がアルファベット順に並べられているかどうかを確認するために、次のコードをまとめました。

def isInAlphabeticalOrder(word):
    word1=sorted(word)
    word2=[]
    for i in word:
        word2.append(i)
    if word2 == word1:
        return True
    else:
        return False

しかし、文字列をリストに変換する以外に、チェックするためのより効率的な方法(コードの行数が少ない)が必要だと思います。各文字をリストに変換せずに文字列をアルファベット順にソートするオペランドはありませんか?誰かがより効率的な方法を提案できますか?

4

7 に答える 7

18

これには O(n) であるという利点があります (文字列のソートは O(n log n) です)。Python の文字 (または文字列) は、アルファベット順で前にある場合、別の文字よりも「小さい」ため、文字列がアルファベット順であるかどうかを確認するには、隣接する文字の各ペアを比較するだけです。また、range(len(word)) の代わりに range(len(word) - 1) を使用することに注意してください。そうしないと、ループの最後の繰り返しで文字列の境界を超えてしまうからです。

def isInAlphabeticalOrder(word):
    for i in range(len(word) - 1):
        if word[i] > word[i + 1]:
            return False
    return True
于 2012-12-01T17:08:18.163 に答える
14

これは、これを行うための簡単な(そしてPythonの慣用的な)方法です。

def isInAlphabeticalOrder(word):
    return word==''.join(sorted(word))

>>> isInAlphabeticalOrder('abc')
True
>>> isInAlphabeticalOrder('acb')    
False
于 2012-12-01T16:57:03.847 に答える
4

ワンライナーとしてこれを試してください:

all(x <= y for x, y in zip(word, word[1:]))
于 2012-12-01T17:10:28.367 に答える
3

次のように関数で使用できますgenerator:-

def isInAlphabeticalOrder(word):
    return all((word[i+1] >= word[i] for i in range(len(word) - 1)))

ジェネレーターは、指定された範囲から の各値を取得iし、そのインデックスの文字を前のインデックスの文字と比較します。allそして、すべての比較結果が関数に渡されTrue、すべての値が である場合に返されますTrue

>>> def isInAlphabeticalOrder(word):
        return all((word[i+1] >= word[i] for i in range(len(word) - 1)))

>>> isInAlphabeticalOrder("rohit")
False
>>> isInAlphabeticalOrder("aabc")
True
>>> isInAlphabeticalOrder("abc")
True

もちろんそれは考慮していませんcase-insensitivity。それを考慮したい場合は、return ステートメントを次のように変更します。

return all((str.lower(word[i+1]) >= str.lower(word[i]) for i in range(len(word) - 1)))
于 2012-12-01T16:55:41.830 に答える