指定された文字列の文字が同じかどうかを確認する最短の方法は?文字列にPythonの文字が同じかどうかを確認する方法
あなたがname = 'aaaaa'
またはsurname = 'bbbb'
またはunderscores = '___'
またはp = '++++'
を持っている場合たとえば、あなたはどのように文字が同じである知ってチェックしますか?
指定された文字列の文字が同じかどうかを確認する最短の方法は?文字列にPythonの文字が同じかどうかを確認する方法
あなたがname = 'aaaaa'
またはsurname = 'bbbb'
またはunderscores = '___'
またはp = '++++'
を持っている場合たとえば、あなたはどのように文字が同じである知ってチェックしますか?
オプションの文字のセットが長さ1を持っているかどうかをチェックすることです:
import re
p = re.compile(ur'^(.)\1*$')
re.search(p, "aaaa") # returns a match object
re.search(p, "bbbb") # returns a match object
re.search(p, "aaab") # returns None
は、ここでは、この正規表現パターンが何を意味するのかの説明です:文字列が非常に長く、それは彼らがすべて同じCHであることはまれだ場合
>>> len(set("aaaa")) == 1
True
またはall()
と、これは速いかもしれませんaracterは(が、その後の正規表現は、あまりにも良いです):
>>> s = "aaaaa"
>>> s0 = s[0]
>>> all(c == s0 for c in s[1:])
True
WOW!これだよ! Pythonic!大文字と小文字が混在する文字列を扱うために 'len(set(s.lower()))== 1'を追加しました。 – Yax
'all'バージョンでは、 's [0]'をgen expの外側のローカルに割り当てると、より速く実行できます。空のiterableの 'all'は' True'を返すので、 'len(s)== 1または'部分を行う必要はありません。たとえば、(存在しない)項目の条件がfalseではないため、 'all(範囲(0)のFalse)'はTrueを返します。 –
@ PM2Ring:right – RemcoGerlich
あなたはこのために正規表現を使用することができます。https://regexper.com/#%5E(.)%5C1 *%は24
compare == len(name) * name[0]
if(compare):
# all characters are same
else:
# all characters aren't same
:
s = "aaaaa"
s.count(s[0]) == len(s)
ここではいくつかの方法があります。そのテストループはCの速度で動作しますが、それは重複した文字列を作成するので、それはより多くのRAMを使用しているため、文字列は、非常に長い場合を除き
def all_match0(s):
head, tail = s[0], s[1:]
return tail == head * len(tail)
def all_match1(s):
head, tail = s[0], s[1:]
return all(c == head for c in tail)
all_match = all_match0
data = [
'aaaaa',
'bbbb',
'___',
'++++',
'q',
'aaaaaz',
'bbbBb',
'_---',
]
for s in data:
print(s, all_match(s))
出力
aaaaa True
bbbb True
___ True
++++ True
q True
aaaaaz False
bbbBb False
_--- False
all_match0
が速くなります。非常に長い文字列の場合、重複する文字列を作成するのにかかる時間は重要になります。もちろん、重複した文字列を作成するまでは何のテストも行うことができません。
all_match1
は短い文字列であってもわずかに遅くなければならず、不一致が見つかるとすぐにテストを中止するため、文字列の不一致が早期に発生した場合はall_match0
よりも早くなることさえあります。
Counter
(高性能コンテナデータ型)を使用してみてください。
>>> from collections import Counter
>>> s = 'aaaaaaaaa'
>>> c = Counter(s)
>>> len(c) == 1
True
@Moses Koledoye:重複はありません。答えをもう一度チェックしてください。 – Yax
詐欺師の回答を確認しましたか?あなたの質問がうまく受け入れられなかったわけではありませんが、それはSO Q&Asを分散させない方法です。 –
@MosesKoledoye:君のデュープのターゲットは私にはうまく見える...そして今は自分自身のデュープのターゲットを探すのではなく、ちょっと恥ずかしいと感じる。 :oops::) –