@Jungles
Молодой и зелёный

Как занести данные в таблицу?

rank['contains_genre'] = [any( y in x for y in genres) for x in rank.genres]
genres-это входные данные

В результате в таблице видим либо True, либо False, с теми же данными
genres=['Drama', 'Crime']
b=['Drama', 'Action', 'Crime', 'Thriller']
c=[any( y in x for y in genres) for x in b]

с
[True, False, True, False]

а с
c=[all( y in x for y in genres) for x in b]
вообще
[False, False, False, False]

Получается уже 4 значения, а почему же тогда в таблицу идет одно? Там еще зависит от all и any, но они работают непонятно, потому что all возвращает True даже если в rank.genres есть то чего нет genre.
  • Вопрос задан
  • 267 просмотров
Пригласить эксперта
Ответы на вопрос 1
@kamenyuga
Тут явно проблемы в логике сравнения наборов значений. Зачем 2 цикла вместе с оператором in? Что-то явно лишнее - либо оператор, либо один из циклов. А то проверяется наличие строки в строке, а не в наборе строк.

Вот пример исправления:
# хотим отобрать фильмы с такими жанрами - хотя бы одним, но не обязательно всеми сразу
genres_to_look_for = ['Drama', 'Crime']

# вот набор фильмов и их жанров
movies_and_genres = {
    1: ['Drama', 'Action', 'Crime', 'Thriller'],
    2: ['Drama'],
    3: ['Drama'],
    4: ['Comedy']}

# для каждого фильма проверяем наличие у него искомых жанров (хотя бы одного)
# если any заменить на all, то будет проверяться одновременное наличие всех искомых жанров
movies_filtered = {
    movie: any((genre in genres) for genre in genres_to_look_for)
    for movie, genres in movies_and_genres.items()
    }

print(movies_filtered)


Получаем {1: True, 2: True, 3: True, 4: False} - прямо то, что надо, согласно моему пониманию задачи - в первых трех есть жанр drama, последний в пролете. А если использовать all, то получится {1: True, 2: False, 3: False, 4: False}.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы