2016-09-22 3 views
3

指定された文字列の文字が同じかどうかを確認する最短の方法は?文字列にPythonの文字が同じかどうかを確認する方法

あなたがname = 'aaaaa'またはsurname = 'bbbb'またはunderscores = '___'またはp = '++++'を持っている場合たとえば、あなたはどのように文字が同じである知ってチェックしますか?

+0

@Moses Koledoye:重複はありません。答えをもう一度チェックしてください。 – Yax

+2

詐欺師の回答を確認しましたか?あなたの質問がうまく受け入れられなかったわけではありませんが、それはSO Q&Asを分散させない方法です。 –

+0

@MosesKoledoye:君のデュープのターゲットは私にはうまく見える...そして今は自分自身のデュープのターゲットを探すのではなく、ちょっと恥ずかしいと感じる。 :oops::) –

答えて

13

オプションの文字のセットが長さ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 
+0

WOW!これだよ! Pythonic!大文字と小文字が混在する文字列を扱うために 'len(set(s.lower()))== 1'を追加しました。 – Yax

+1

'all'バージョンでは、 's [0]'をgen expの外側のローカルに割り当てると、より速く実行できます。空のiterableの 'all'は' True'を返すので、 'len(s)== 1または'部分を行う必要はありません。たとえば、(存在しない)項目の条件がfalseではないため、 'all(範囲(0)のFalse)'はTrueを返します。 –

+0

@ PM2Ring:right – RemcoGerlich

1
compare == len(name) * name[0] 

if(compare): 
    # all characters are same 
else: 
    # all characters aren't same 
1

s = "aaaaa" 
s.count(s[0]) == len(s) 
1

ここではいくつかの方法があります。そのテストループは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よりも早くなることさえあります。

1

Counter(高性能コンテナデータ型)を使用してみてください。

>>> from collections import Counter 
>>> s = 'aaaaaaaaa' 
>>> c = Counter(s) 
>>> len(c) == 1 
True 
関連する問題