Как разбить список словаря на 2 отдельных списка словарей с проверкой на равенство - PullRequest
3 голосов
/ 01 февраля 2020

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

Это мой код, который должен генерировать два отдельных списка словарей. plays_games_entries действительно работает. Я пробую это с другим, но это не работает, как я намерен. Я знаю проблему, но это трудно объяснить, и я не знаю, каким должен быть мой подход. Если честно, я немного запутался, потому что оператор if работает, а оператор else нет.

def get_name_and_due(request, played_games, games_list):
    open_games_entries = []
    played_games_entries = []

    for game in games_list:
        for played_game in played_games:
            due_perc = convert_due_into_percentage(game['due'], request.session.get('max_due'))
            if game['game_name'] == played_game['played_game_name']:
                played_games_entries.append({'name': game['game_name'], 'due': due_perc})
                break
            else:
                pass

Вот мои значения для параметров plays_games и game_list.

games_list = [
    {'index': '1', 'game_name': 'Temtem', 'due': '00:30:04'},
    {'index': '2', 'game_name': 'The Forest', 'due': '10:00:30'},
    {'index': '3', 'game_name': 'The Witcher 3: Wild Hunt', 'due': '50:15:25'},
    {'index': '4', 'game_name': 'STAR WARS Jedi: Fallen Order', 'due': '18:15:00'}
]

played_games = [
    {'played_game_name': 'Grand Theft Auto: San Andreas'},
    {'played_game_name': 'The Witcher 3: Wild Hunt'},
    {'played_game_name': 'ONE PIECE: PIRATE WARRIORS 4'}
]

И последний код будет ожидаемым результатом . И отметить, что plays_game_entries действительно работает

open_games_entries = [
    {'index': '1', 'game_name': 'Temtem', 'due': '24.44'},
    {'index': '2', 'game_name': 'The Forest', 'due': '10'},
    {'index': '4', 'game_name': 'STAR WARS Jedi: Fallen Order', 'due': '20'}
]

played_games_entries = [
    {'index': '3', 'game_name': 'The Witcher 3: Wild Hunt', 'due': '100'}
]

Я работал весь день, чтобы исправить это самостоятельно, но мне не удалось. Я смотрю на проблему с inte rnet и SO, и многие предлагают Set. Но я не рассматривал этот подход, потому что он основан на списке, и у меня есть список словарей. И мне действительно интересно увидеть подход с -10 oop, потому что я действительно думаю, что это возможно.

С наилучшими пожеланиями

Линда

1 Ответ

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

Вы можете использовать else как часть for (когда for-l oop заканчивается без перерыва, выполнение кода продолжается в другом месте):

...
for played_game in played_games:
    ...
else:
    open_games_entries.append(...

В вашем коде:

for game in games_list:
    for played_game in played_games:
        due_perc = convert_due_into_percentage(game['due'], request.session.get('max_due'))
        if game['game_name'] == played_game['played_game_name']:
            played_games_entries.append({'index': game['index'], 'game_name': game['game_name'], 'due': due_perc})
            break
    else:
        open_games_entries.append({'index': game['index'], 'game_name': game['game_name'], 'due': due_perc})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...