2013-10-05 6 views
0

Я пытаюсь подсчитать количество раз, когда в моем списке появляется слово «fizz». Это код:len() из этого списка не подходит: Python

def fizz_count(key): 
    for x in key: 

     if x != 'fizz': 
      key.remove(x) 
      return len(key) 

print fizz_count(["fizz",0,0,0,10]) 

Однако это возвращает 4 вместо 1. Любая помощь с моим кодом?

+4

Просто используйте встроенный метод 'count':' ["fizz", 0,0,0,10] .count ("fizz") '. – BrenBarn

+0

@BrenBarn Подождите, я удалю все элементы, которые не "fizz". Разве я? – user2848908

+2

Нет, это не так, как объясняют ответы. Вы удаляете один элемент, а затем прекращаете работу. – BrenBarn

ответ

6

Как только функция что-то возвращает, она ломается. Следовательно, когда вы делаете return len(key), вы возвращаете длину списка после удаления первого 0.

Если вы хотите, чтобы подсчитать, сколько раз что-то появляется в списке, просто сделать key.count('fizz')


Вы никогда не должны удалять элементы из списка во время прохода по нему. Посмотрите, что произойдет, если вы продолжили свой цикл, и там было больше "fizz" эс:

>>> key = ['fizz', 1, 2, 3, 'fizz', 4] 
>>> for x in key: 
...  if x != 'fizz': 
...    key.remove(x) 
...    print key # Print the list after an item is removed. 
... 
['fizz', 2, 3, 'fizz', 4] 
['fizz', 2, 'fizz', 4] 
['fizz', 2, 'fizz'] 

Обратите внимание, как он никогда не извлекал 2? Потому что for-loop никогда не подходил к нему, потому что длина/порядок списка изменились.

1

Он возвращает 4 вместо 1, поскольку отступ приводит к тому, что return является частью состояния if.

1

Я бы, наверное, написать эту функцию с помощью выражения генератора, например, так:

def fizz_count(key): 
    return len([x for x in key if x == 'fizz']) 

Таким образом, вы не получите в проблемы, которые возникают при итерации по коллекции и удалить его элементы одновременно , Или, как отметили некоторые другие пользователи, я бы использовал функцию count (хотя раньше я не знал об этом - спасибо всем, кто показал это в этой теме).

P.S. По-моему, генераторные выражения являются конструкциями более высокого уровня и должны использоваться вместо циклов (да, я знаю, что есть случаи, когда конструкция цикла даст вам более четкий код - вы всегда должны думать, что будет лучшим способом ее написать).

+3

По-прежнему возвращается ['fizz', 0,10]. Проблема в том, что он не должен изменять список, пока он повторяется. – aIKid

+0

@alKamili, ты абсолютно прав.Я полностью забыл о проблемах, которые возникают, когда мы перебираем коллекцию и удаляем ее элементы одновременно. Я удалю «исправленную» версию кода. Спасибо за комментарий! – aga

+0

У вас есть * список * понимание, а не выражение * generator * – TerryA

2

Прежде всего вы должны использовать метод подсчета из стандартной библиотеки, чтобы сделать то же самое:

["fizz",0,0,0,10].count("fizz") 

Она должна возвращать 1. Однако, если вы хотели бы пойти со своей собственной логикой, то вот обновлено один:

def fizz_count(key): 
    for x in key: 
     if x != 'fizz': 
      key.remove(x) 
    return len(key) 

print fizz_count(["fizz",0,0,0,10]) 

Ответное заявление внутри, если блок вызывает функцию, чтобы вернуться так быстро, как вы найти первый элемент, не совпадающий с «шипением». Итак, поскольку у вас есть список из 5 элементов, вы всегда будете получать 4 в качестве вывода.

+0

Запустите свой код .. – TerryA

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