2016-09-22 61 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 
相关问题