2016-10-11 3 views
1

Мой код предназначен для идентификации первых неповторяющихся строковых символов, пустых строк, повторяющихся строк (то есть 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

Дело в том, что 'if x in counts' будет искать' x' только в случае, чувствительном к регистру. –

+0

Право, я хочу, чтобы это заявление игнорировалось при поиске x –

+0

Любые новости? Ниже я разместил альтернативное решение на основе регулярных выражений. –

ответ

0

При сравнении двух букв используйте lower() для сравнения символов в строке. Примером может быть:

string ="aabcC" 
count = 0 
while count < len(string) - 1: 
    if string[count].lower() == string[count + 1].lower(): 
     print "Characters " + string[count] + " and " + string[count + 1] + " are repeating." 
    count += 1 
+0

будет ли это рассматриваться как собственный цикл? где это будет помещено в мой сценарий? –

+0

@ Mr.Jibz Я добавил более подробный пример для вас – PrestonM

0

Дело в том, что x в counts ищется в регистронезависимом образом. Вы должны реализовать свой собственный регистрозависимости словарь, или использовать регулярные выражения для обнаружения повторяющихся букв:

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])захватывает char в группу 1, а (?=.*\1) - это lookahead, где \1 соответствует одному и тому же признаку, записанному в группу 1, после любых символов 0+, соответствующих шаблону .*, а флаг re.S помогает поддерживать строки с разрывами строк) ,

re.sub удалит все найденные буквы нечувствительным к регистру образом, поэтому мы получим уникальные символы в string после блока while.

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