2016-09-22 130 views
3

檢查給定字符串是否具有相同字符的最短方法是什麼?如何檢查字符串是否在Python中具有相同的字符

例如,如果您有name = 'aaaaa'surname = 'bbbb'underscores = '___'p = '++++',您如何檢查以瞭解字符是否相同?

+0

@Moses Koledoye:不可能重複。再次檢查答案。 – Yax

+2

你是否在複製中檢查了答案?把一個問題作爲愚蠢行爲來解決並不意味着你的問題沒有得到很好的回答,這是一種使問答不那麼分散的方法。 –

+0

@MosesKoledoye:你的愚蠢目標對我來說看起來很好......現在我覺得有點不好意思回答,而不是自己尋找一個愚蠢的目標。 :oops::) –

回答

13

一個選項是檢查組的字符是否具有長度1 :

>>> len(set("aaaa")) == 1 
True 

或者與all(),這可能會更快,如果字符串很長,這是罕見的,他們都是同一個通道aracter(但隨後的正則表達式也好啊):

>>> s = "aaaaa" 
>>> s0 = s[0] 
>>> all(c == s0 for c in s[1:]) 
True 
+0

哇!就是這個! Python的!我已經添加了'len(set(s.lower()))== 1'來處理大小寫混合的字符串。 – Yax

+1

使用'all'版本時,如果將'[0]'賦值給gen exp之外的某個本地,它會稍快一點。而且你不需要執行'len(s)== 1或'部分,因爲在空的迭代器中'all'返回'True'。例如'all(False for i in range(0))'返回True,因爲條件對於任何(不存在的)項都是假的。 –

+0

@ PM2Ring:對 – RemcoGerlich

3

您可以使用正則表達式是:

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 

這裏是什麼這個正則表達式的說明:https://regexper.com/#%5E(.)%5C1 *%24

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

這裏有幾個方法。

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會更快,除非字符串很長,因爲它的測試循環中C的速度運行,但它使用更多的內存,因爲它構造了一個重​​復的字符串。對於非常長的字符串,構造重複字符串所花費的時間變得很重要,當然在創建重複字符串之前它不能進行任何測試。

all_match1應該只是稍微慢一些,即使是短期字符串,因爲它一旦停止試驗,因爲它發現不匹配甚至可能比all_match0快,如果字符串中出現的不匹配足夠早。

1

嘗試使用Counter(高性能容器數據類型)。

>>> from collections import Counter 
>>> s = 'aaaaaaaaa' 
>>> c = Counter(s) 
>>> len(c) == 1 
True 
相關問題