检查给定字符串是否具有相同字符的最短方法是什么?如何检查字符串是否在Python中具有相同的字符
例如,如果您有name = 'aaaaa'
或surname = 'bbbb'
或underscores = '___'
或p = '++++'
,您如何检查以了解字符是否相同?
检查给定字符串是否具有相同字符的最短方法是什么?如何检查字符串是否在Python中具有相同的字符
例如,如果您有name = 'aaaaa'
或surname = 'bbbb'
或underscores = '___'
或p = '++++'
,您如何检查以了解字符是否相同?
一个选项是检查组的字符是否具有长度1 :
>>> len(set("aaaa")) == 1
True
或者与all()
,这可能会更快,如果字符串很长,这是罕见的,他们都是同一个通道aracter(但随后的正则表达式也好啊):
>>> s = "aaaaa"
>>> s0 = s[0]
>>> all(c == s0 for c in s[1:])
True
哇!就是这个! Python的!我已经添加了'len(set(s.lower()))== 1'来处理大小写混合的字符串。 – Yax
使用'all'版本时,如果将'[0]'赋值给gen exp之外的某个本地,它会稍快一点。而且你不需要执行'len(s)== 1或'部分,因为在空的迭代器中'all'返回'True'。例如'all(False for i in range(0))'返回True,因为条件对于任何(不存在的)项都是假的。 –
@ PM2Ring:对 – RemcoGerlich
您可以使用正则表达式是:
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
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)
这里有几个方法。
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
快,如果字符串中出现的不匹配足够早。
尝试使用Counter
(高性能容器数据类型)。
>>> from collections import Counter
>>> s = 'aaaaaaaaa'
>>> c = Counter(s)
>>> len(c) == 1
True
@Moses Koledoye:不可能重复。再次检查答案。 – Yax
你是否在复制中检查了答案?把一个问题作为愚蠢行为来解决并不意味着你的问题没有得到很好的回答,这是一种使问答不那么分散的方法。 –
@MosesKoledoye:你的愚蠢目标对我来说看起来很好......现在我觉得有点不好意思回答,而不是自己寻找一个愚蠢的目标。 :oops::) –