Есть ли способ перечислить список или словарь с одинаковым индексом? - PullRequest
1 голос
/ 24 апреля 2019

Я хочу перечислить список или словарь, если элементы имеют одинаковое значение или равны, я хочу, чтобы они использовали 1 индекс.

Это мой код:

def print_data(league_results):
    for i, (team, points) in 
    enumerate(sorted(league_results.items(), key=lambda x: x[1], 
    reverse=True), 1):
        if points == 1:
          i = i
        print('{}. {}, {}'.format(i, team.strip(''), points))

выход

1. Man City, 6
2. Liverpool, 5
3. Everton, 1
4. Stoke, 1
5. Fulham, 0

Это мой желаемый результат: если команда разделяет точку, она должна иметь одинаковый индекс. Everton & Stoke должны иметь одинаковый индекс.

1. Man City, 6
2. Liverpool, 5
3. Everton, 1 
3. Stoke, 1
4. Fulham, 0

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете использовать itertools.groupby:

def print_data(league_results):
    grouped_results = itertools.groupby(
        sorted(league_results.items(), key=lambda x: x[1], reverse=True), 
        key=lambda x: x[1]
    )
    for i, (_, teams) in enumerate(grouped_results, 1):
        for team, points in teams:
            print('{}. {}, {}'.format(i, team.strip(''), points))

Результаты:

1. Man City, 6
2. Liverpool, 5
3. Everton, 1
3. Stoke, 1
4. Fulham, 0

Здесь у вас есть живой пример

Объяснение:

groupby сделает итерацию с совпадением количества очков и команд (сгруппирует их, если они отсортированы), давая нам итерацию (points, [(team, points), ...]), ....Следовательно, при его перечислении вы будете перечислять эти группы, это будет наш индекс i.Поскольку мы хотим, чтобы перечисление начиналось с 1 вместо 0, мы просто просим функцию начать с него enumerate(iterable, start_enumerate_value)

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