我的代码打算识别第一个非重复字符串字符,空字符串,重复字符串(即abba
或aa
),但它也意味着处理大小写输入相同的字符,同时在其输入的原始情况下返回准确的非重复字符。
def first_non_repeat(string):
order = []
counts = {}
for x in string:
if x in counts and x.islower() == True:
counts[x] += 1
else:
counts[x] = 1
order.append(x)
for x in order:
if counts[x] == 1:
return x
return ''
我在第5行的逻辑是,如果我将所有字母输入设为小写,那么它将遍历字符串输入并且不区分大小写。但截至目前,当我真正需要'sTreSS'
时,请输入's'
并输出'T'
。如果最后两个S
是小写的,那么它将是'T'
但我需要足够灵活的代码来处理任何案例输入。
答案 0 :(得分:0)
比较两个字母时,使用lower()比较字符串中的字符。一个例子是:
includes?
答案 1 :(得分:0)
重点是x
中的counts
是以不区分大小写的方式搜索的。您必须实现自己的不区分大小写的Dictionary,或使用正则表达式来检测重复的字母:
import re
def first_non_repeat(string):
r = re.compile(r'([a-z])(?=.*\1)', re.I|re.S)
m = r.search(string)
while m:
string = re.sub(m.group(1), '', string, re.I)
m = r.search(string)
return string[0]
print(first_non_repeat('sTreSS'))
请参阅Python demo
([a-z])(?=.*\1)
正则表达式找到也出现在前方的任何ASCII字母(请注意([a-z])
将字符捕获到第1组,(?=.*\1)
是预告其中\1
匹配在与.*
模式匹配的任何0+字符后捕获到组1中的相同字符,re.S
标记有助于支持包含换行符的字符串。)
re.sub
会以不区分大小写的方式删除所有找到的字母,因此我们只会在string
阻止后的while
中获取唯一字符。
答案 2 :(得分:0)
您可以对代码进行一些小改动以使其正常工作。
def first_non_repeat(string):
order = []
counts = {}
for x in string:
char_to_look = x.lower() #### convert to lowercase for all operations
if char_to_look in counts :
counts[char_to_look] += 1
else:
counts[char_to_look] = 1
order.append(char_to_look)
for x in string: ### search in the string instead or order, character and order will remain the same, except the case. So again do x.lower() to search in count
if counts[x.lower()] == 1:
return x
return ''1