2015-11-08 3 views
0

Я пытаюсь решить проблему для онлайн-судьи. Проблема состоит в том, чтобы создать программу, в которой пользователь вводит имя или любую строку, и если строка не найдена в списке или базе данных, она печатает «ОК», но если это повторение, то создайте новую запись с тем же именем пользователя вступил, но «1» конкатенат к нему. Например, если пользователь ввел abc, если повторная печать abc1, и если оно было повторено до печати abc2 и так далее.система регистрации с использованием python

Для этого я написал следующий код:

n=int(raw_input()) # number of testcases 
counter=0 
listaa=[] # list to save 
comp=[] 
for x in xrange(n): 
    listaa.append(raw_input()) 
    for i in listaa: 
     if i not in comp: 
      print 'OK' 
      comp.append(i) 
     elif i in comp: 
      counter+=1 
      print "{}{}".format(i,counter) 

Если я вход:

3 # number of test case 
abc # user string or name or anything 
abc # its repeated 
def # new one 

Я получаю этот странный вывод, который иллюстрирует эту проблему:

OK # first one and not repeat so print ok no problem 
abc1 # it print abc1 ok no problem 
abc2 # but why it print it twice 
abc3 # for the third and new input it print abc3? 
abc4 # and 4 
OK # and finally ok that I want but the above I don't want and instead 
    # I want only "ok", and why it entered to elif clause if the first 
    # condition is true? 

Я использую elif. Из того, что я понимаю, если условие if не соответствует действительности, оно переместилось на elif. Это неправильно? У кого-нибудь есть решение? Я попытался использовать функцию, но когда я использую в ней return, цикл останавливается.

+0

Добавить печати statemen в начале для цикла ниже «для г в listaaa», распечатайте я и listaa и комп, то, возможно, вы будете работать что вы делаете неправильно. Также FYI ваш 'elif i in comp' может быть заменен на 'else', потому что тест i в comp 'является инверсией' i not in comp 'в выражении if. – barny

ответ

0

Я думаю, что вы не понимаете свой выход.

OK 

печатается после первой строки вставляется

abc1 
abc2 

Печатаются после второй строки вставляется. comp уже содержит «abc» из предыдущей итерации, а listaa = ["abc", "abc"] цикл for перебирает каждый элемент в listaa и проверяет, существует ли он в comp - оба они делают это, вы получаете 2 отпечатка.

и

abc3 
abc4 

будут напечатаны после того, как вы вводите

def 

У вас есть еще одна проблема в том, что у вас есть глобальный счетчик, так что если вы должны были ввести

4 
abc 
abc 
def 
def 

вас получило бы неправильный счет для def.

Следующий код будет решить обе проблемы:

n=int(raw_input()) # number of testcases 
db = {} 
for x in xrange(n): 
    s = raw_input() 
    if s not in db: 
     db[s] = 0 
     print 'OK' 
    else: 
     db[s] += 1 
     print "{}{}".format(s,db[s]) 
+0

эта работа и принята, когда я ставлю код @zetysz, чтобы получить время. Лимит времени превысил ваш код, и он работает быстрее, как вы это делаете. Можете ли вы посоветовать мне книгу или где вы научитесь это делать, и большое спасибо вам. –

0

В вашем коде, я думаю, проблема в том, что вы сохраняете перед тестом.

Этот пример кода гравюр:

3 
abc 
OK 
abc 
abc1 
abc 
abc2 

если это результат, который вы ищете, код:

n=int(raw_input()) #This Is the TestCase That user Enter 
counter=0 
listaa=[] # list to save 
comp=[] 
for x in xrange(n): 
    val = raw_input() 
    occ = listaa.count(val) 
    if occ: 
     print "{}{}".format(val, occ) 
    else: 
     print 'OK' 
     comp.append(val) 
    listaa.append(val) 

Я надеюсь, что это будет полезно.

Смежные вопросы