[Python] Как отсортировать строку с двумя переменными? - PullRequest
2 голосов
/ 10 апреля 2011

Здравствуйте, я немного новичок в Python, поэтому, пожалуйста, потерпите меня.

Моя программа на Python имеет следующие строки:

печать "Игрок 1:" + стр. (Player1points)

печать "Игрок 2:" + стр. (Player2points)

печать "Игрок 3:" + стр. (Player3points)

печать "Игрок 4:" + стр. (Player4points)

Очки игрока # - это то, что моя программа рассчитала, поэтому каждый раз, когда я их запускаю, они меняются.

Результат даст:

Игрок 1: 3

Игрок 2: 4

Игрок 3: 3

Игрок 4: 5

Если возможно, я хочу отсортировать результат так, чтобы очки каждого игрока ранжировались сначала от самого высокого до самого низкого, а затем игрока. Если два игрока связаны за очки, игрок с наименьшим номером будет указан первым.

Итак, я ожидаю, что мои результаты будут такими:

Игрок 4: 5

Игрок 2: 4

Игрок 1: 3

Игрок 3: 3

Любая помощь будет принята с благодарностью !!

Ответы [ 5 ]

2 голосов
/ 10 апреля 2011

Если у вас уже есть объекты или словари игроков, вы можете выполнить сортировку с помощью:

players.sort(key=lambda player: player.score, reverse=True)

Если нет, обработайте ваш массив и разбейте на каждый ':'

Пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def main():
    "entry point"
    player_strings = ['Player 1:3', 'Player 2:4', 'Player 3:3', 'Player 4:5']
    players = []
    for player_string in player_strings:
        name, score = player_string.split(':')
        players.append({'name':name, 'score':score})
    players.sort(key=lambda player: int(player['score']), reverse=True)
    for player in players:
        print ('%s has a score of %s' % (player['name'], player['score']))

if __name__ == '__main__':
    main()
1 голос
/ 10 апреля 2011
0 голосов
/ 10 апреля 2011

Предположим, что «отчеты игроков» находятся в списке:

values = ['Player 1: 3','Player 2: 4','Player 3: 3','Player 4: 5']

values.sort(key=lambda s: [(-int(b),a) for a,b in (s.split(':'),)])

print values

результаты в

['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']

=============

Боб Лоин сказал, что хочет получить

Игрок 4 : 5, Игрок 2 : 4, Игрок 1 : 3, Игрок 3 : 3

Даниэль Роузман работает хорошо или нет, в зависимости от списка обработанных.

Мое решение дает правильный результат. Смотрите разницу во втором списке

values = ['Player 1: 3','Player 2: 4','Player 3: 3','Player 4: 5']

print '   ',values
print
print 'Dan',sorted(values, key=lambda s: s.split(': ')[1], reverse=True)
print 'eyq',sorted(values, key=lambda s: [(-int(b),a) 
                                          for a,b in (s.split(':'),)])

print '\n===================================\n'

values = ['Player 3: 3','Player 2: 4','Player 1: 3','Player 4: 5']

print '   ',values
print
print 'Dan',sorted(values, key=lambda s: s.split(':')[1], reverse=True)
print 'eyq',sorted(values, key=lambda s: [(-int(b),a) 
                                          for a,b in (s.split(': '),)])

результат

    ['Player 1: 3', 'Player 2: 4', 'Player 3: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']

===================================

    ['Player 3: 3', 'Player 2: 4', 'Player 1: 3', 'Player 4: 5']

Dan ['Player 4: 5', 'Player 2: 4', 'Player 3: 3', 'Player 1: 3']
eyq ['Player 4: 5', 'Player 2: 4', 'Player 1: 3', 'Player 3: 3']
0 голосов
/ 10 апреля 2011

Передача «ключевой функции» в метод list.sort позволяет настроить ее сортировку.

def sort_players(players):
    r"""Sort the players by points.

    >>> print sort_players('Player 1: 3\n'
    ...                    '\n'
    ...                    'Player 2: 4\n'
    ...                    '\n'
    ...                    'Player 3: 3\n'
    ...                    '\n'
    ...                    'Player 4: 5\n')
    Player 4: 5
    Player 2: 4
    Player 1: 3
    Player 3: 3
    """
    # split into a list
    players = players.split("\n")

    # filter out empty lines
    players = [player for player in players if player != '']

    def points(player_report):
        """Parse the number of points won by a player from a player report.

        A "player report" is a string like 'Player 2: 6'.
        """
        import re
        # Match the last string of digits in the passed report
        points = re.search(r'\d+$', player_report).group()
        return int(points)

    # Pass `points` as a "key function".
    # The list will be sorted based on the values it returns.
    players.sort(key=points, reverse=True)

    # Make the sorted list back into a string.
    return "\n".join(players)
0 голосов
/ 10 апреля 2011
sorted(values, key=lambda s: s.split(': ')[1], reverse=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...