подсчет элементов (строк) в списке python - PullRequest
0 голосов
/ 07 февраля 2020
genres_list = ['rock', 'pop', 'folk', 'dance', 'rusrap', 'ruspop', 'world', 'electronic', 'alternative', 'children', 'rnb', 'hip', 'jazz','postrock', 'latin', 'classical', 'metal', 'reggae', 'tatar','blues','pop', 'jazz']

# write function to count the number of specific genre in genres_list 

def find_genre(genre):
    count=0
    for count in genres_list:
        if count == genre:
            count=count+1
    return count

number=find_genre(pop)
print(number)

вывод:

TypeError: может объединять только str (не "int") в str

Ответы [ 4 ]

4 голосов
/ 07 февраля 2020

Попробуй это. У list есть метод подсчета количества вхождений элемента.

genres_list = ['rock', 'pop', 'folk', 'dance', 'rusrap', 'ruspop', 'world', 'electronic', 'alternative', 'children', 'rnb', 'hip', 'jazz','postrock', 'latin', 'classical', 'metal', 'reggae', 'tatar','blues','pop', 'jazz']

print(genres_list.count('pop'))

output

2

list.count() сложность O(n).

Вы можете написать свою собственную функцию подсчета.

def find_genre(genre):
    count=0
    for _genre in genres_list:
        if _genre==genre:
            count+=1
    return count

print(find_genre('pop'))
#2

timeit анализ по списку размером 2 миллиона. Результаты на момент написания статьи (python 3.7, windows 10)

In [38]: timeit genres_list.count('pop') #My answer
26.6 ms ± 939 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [40]: timeit Counter(genres_list)['pop'] #Pitto's answer using collections.Counter
92.5 ms ± 751 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Теперь пользовательские функции подсчета, включая меня, предложены.

def find_genre(genre):
    count=0
    for _genre in genres_list:
        if _genre==genre:
            count+=1
    return count

In [42]: timeit find_genre('pop')
63.9 ms ± 803 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Просто для сравнения ( Который я не рекомендую использовать ). Я написал несколько других функций для вычисления количества.

In [36]: timeit sum(list(map(lambda x:x=='pop',genres_list)))
334 ms ± 13.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [37]: timeit len(list(filter(lambda x:x=='pop',genres_list)))
188 ms ± 18.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [44]: timeit ' '.join(genres_list).count('pop')
41.5 ms ± 2.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

В вашем коде произошла ошибка потому что вы используете count для расчета количества жанров и снова вы использовали count в качестве циклической переменной. В каждой итерации count становится str, и мы не можем добавить str к типу int.

2 голосов
/ 07 февраля 2020

Я бы использовал Counter для достижения этого результата:

import collections

genres_list = ['rock', 'pop', 'folk', 'dance', 'rusrap', 'ruspop', 'world', 'electronic', 'alternative', 'children', 'rnb', 'hip', 'jazz','postrock', 'latin', 'classical', 'metal', 'reggae', 'tatar','blues','pop', 'jazz']

counted = collections.Counter(genres_list)
print(counted['rock'])

Вывод
1

Другое возможное решение, если вы специально хотите исправить свой текущий подход:

def find_genre(genre):
    count=0
    for current_genre in genres_list:
        if current_genre == genre:
            count=count+1
    return count

number=find_genre('pop')
print(number)

Вывод
2

Ваша главная проблема заключалась в том, что именование переменной для l oop аналогично названию счетчика переменная сбивала вас с толку (и вел себя иначе) считать строку.

0 голосов
/ 07 февраля 2020

Во-первых, вы используете то же имя переменной в вашей итерации, что и индекс в вашем списке.

Во-вторых, вы должны использовать апострофы в аргументе pop, как это 'pop'.

Надеюсь, это поможет:

genres_list = ['rock', 'pop', 'folk', 'dance', 'rusrap', 'ruspop', 'world', 'electronic', 'alternative', 'children', 'rnb', 'hip', 'jazz','postrock', 'latin', 'classical', 'metal', 'reggae', 'tatar','blues','pop', 'jazz']

# write function to count the number of specific genre in genres_list
def find_genre(genre):
    num=0
    for count in genres_list:
        if count == genre:
            num=num+1
    return num

number=find_genre('pop')
print(number)
0 голосов
/ 07 февраля 2020

Как уже отмечал Джонни Мопп в комментариях, for count in genres_list переписывает вашу переменную count в строку, так что вы можете сделать: способ использования списка:

def find_genre(searched_genre):
    return len([genre for genre in genres_list if genre == searched_genre])

Или используйте коллекцию, как предложил @Pitto (что может быть не так интуитивно понятно при первом запуске программирования)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...