2016-04-22 3 views
1

Учитывая список строк, верните счетчик числа строк, где длина строки равна 3 или более, а первая и последняя символы строки одинаковы.Как вернуть число раз, когда строка с конкретными требованиями появляется в списке?

Чтобы решить эту проблему, я создал следующую функцию,

def match_ends(words): 
    FirstL=words[0:1] 
    LastL=words[-1:] 
    x=len(words)>3 and FirstL == LastL 
    count=0 
for x in words: 
    count+=1 
    return count 

тестируют его здесь,

def test(got, expected): 
    if got == expected: 
    prefix = ' OK ' 
    else: 
    prefix = ' X ' 
    print ('%s got: %s expected: %s' % (prefix, repr(got), repr(expected))) 


# Calls the above functions with interesting inputs. 
def main(): 
    print ('match_ends') 
    test(match_ends(['abaa', 'xyzax', 'aa', 'x', 'bbb']), 3) 
    test(match_ends(['', 'x', 'xy', 'xyx', 'xx']), 1) 
    test(match_ends(['aaa', 'be', 'abc', 'hello']), 1) 


    print 

Результат:

X got: 1 expected: 3 
OK got: 1 expected: 1 
OK got: 1 expected: 1 

ответ

-1

Ваш лучший выбор - использовать список. Список постижение состоит из трех частей:

  • преобразование, которое вы хотите выполнить на каждом элементе ввода,
  • сам вход и
  • дополнительный «если» заявление, которое указывает, когда для получения вывода

Так, например, мы можем сказать,

[ x * x    # square the number 
for x in range(5) ] # for each number in [0,1,2,3,4] ` 

, который будет производить литий ул

[0 1 4 9 16] 

Мы можем добавить третью строку (фильтрация), и получить только нечетные номера назад:

[x * x 
for x in range(5) 
if x % 2]  # divide x by 2, take the remainder -- if 1, output the number` 

В вашем конкретном случае, мы не заботимся о части преобразования. Мы просто хотим вывести слово, если оно соответствует вашим критериям:

[word 
for word in word_list 
if len(word) >= 3 and word[0] == word[-1] ] 

Это даст вам список назад. Теперь вам просто нужно получить длину этого списка:

len([word 
for word in word_list 
if len(word) >= 3 and word[0] == word[-1] ] ) 

Хотите превратить это в функцию? Здесь вы найдете:

def count_matching_words(word_list): 
    return len([word 
       for word in word_list 
       if len(word) >= 3 and word[0] == word[-1]]) 
+1

В то время как я одобряю то, как вы нарушили это, я должен протестовать против того, чтобы таким образом разобраться в ваших списках. Этот код может быть ясным, даже если он сконденсирован в одну строку - об единственном времени, когда должны выполняться многострочные списки, - это когда риск превысит 72 символа в строке. –

+0

Как человек, который профессионально преподавал Python более 10 лет, я категорически не согласен. Синтаксис синтаксиса списка постоянно дезориентирует новичков (и не так-новичков) на язык, и я обнаружил, что их разбивка таким образом значительно помогает им понять, что происходит. В тот момент, когда я начал (около двух лет назад) писать свои списки, таким образом, понимание моих учеников значительно улучшилось. – reuven

0

У вас есть несколько проблем здесь:

  1. Когда вы перебираете каждое из слов, вы вставляете returncount в петлю, а не в конце, когда петля заканчивается. Вот почему вы всегда получали 1.

  2. Вы всегдаcount += 1 даже если x является False.

  3. x принимает первый и последний элемент списка, а не первую и последнюю буквы в каждом слове в списке.

  4. Наконец, вы забрасываете boolx в свою петлю for.


Советы

Почему бы не разделить ее на две функции?

def match_end(word): 
    first, last = word[0], word[-1:] 
    return True if first == last and len(word) >= 3 else False 

def match_ends(words): 
    count = 0 
    for word in words: 
     count += 1 if match_end(word) else 0 
    return count 

Первая функция, match_end(word) возвращает bool либо True или False.

  • Во-первых, он устанавливает переменные first и last к первой и последней буквы строки через нарезку.

  • Далее, это return s True, если первая буква совпадает с последней, и если длина слова меньше трех. В противном случае, это return s False. Это делается с помощью Python's Ternary Operator.

Вторая функция, match_ends(words), занимает в списке строк (как ваш оригинал) итерацию по каждому слову в list.

  • Для каждого слова в списке, он проверяет, является ли match_end(word) возвращается True.

    • Если да, это увеличивает счет на 1.

    • В противном случае он ничего не делает (увеличивает счет на 0).

  • И наконец, он возвращает count.