Как я могу изменить эту конкретную строку в определенный ввод - PullRequest
0 голосов
/ 11 апреля 2011

У меня есть следующая строка в моей программе на Python

print "Player 1: " +str(player1points)

, где 'player1points' вычисляется в моей программе.

Результаты дают:

Player 1: 3

где '3' было то, что программа рассчитала для этого прогона.

Однако по одной конкретной функции мне удалось получить помощь здесь

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)

Функция будет принимать только ввод:

Player 1: 3

а не:

"Player 1: " +str(player1points)

Даже если мне кажется, что они оба дают одинаковый результат, как я смогу конвертировать

"Player 1: " +str(player1points)

на соответствующий вход, чтобы функция его принимала.

Примеры:

sort_players('Player 1: 3\n'
             '\n'
             'Player 2: 4\n'
             '\n'
             'Player 3: 3\n')

даст мне

Player 2: 4
Player 1: 3
Player 3: 3

Пример 2:

sort_payers('Player 1: +str(player1points)\n'
            '\n'
            'Player 2: +str(player2points)\n'
            '\n'
            'Player 3: +str(player3points)\n')

даст мне

AttributeError:'NoneType' object has no attribute 'group'

Ответы [ 3 ]

3 голосов
/ 11 апреля 2011
'Player 1: +str(player1points)\n'

Это просто строка, даже если она содержит что-то, что может быть кодом Python.К счастью, Python не будет магически оценивать это.Эта строка будет передана буквально в функцию.Посмотрите на выделение синтаксиса в строке выше и сравните его с этим, который фактически добавляет player1points к строке Player 1::

'Player 1: '+str(player1points)+'\n'

Видите ли, нужно поставить вызов str и + вне строкового литерала, поэтому они имеют значение для Python.(И пока вы это делаете, вы можете переключиться на форматирование строки, например "Player 1: %d" % player1points или "Player 1: {}".format(player1points).)

Сообщение об ошибке, в частности, вызывается этой строкой:

points = re.search(r'\d+$', player_report).group()

Поскольку в строке нет ничего подобного числам (только "+str(player1points)"), re.search вернет None вместо объектов сопоставления - и None, очевидно, ничего не знает о группах.

0 голосов
/ 11 апреля 2011

отсортировано (итерация [, cmp [, ключ [, reverse]]])

Возврат нового отсортированного списка из предметов в итерируемой.

Ваш код - детский бассейн. Но похоже, что данные, которые вы должны обработать, - это строка. Итак, я делаю:

ch = '''\
Player 1: 3

Player 2: 4

Player 3: 3

Player 4: 5
'''
print ch

import re

pat = re.compile('(Player (\d+): (\d+))')

print '------------'
print '\n'.join(x[2] for x in
                sorted((-int(points),number,report)
                       for (report, number, points)
                       in pat.findall(ch)))

результат

Player 1: 3

Player 2: 4

Player 3: 3

Player 4: 5

------------
Player 4: 5
Player 2: 4
Player 1: 3
Player 3: 3

Если входные данные не являются строкой, объясните, что это такое, и я изменю код.

0 голосов
/ 11 апреля 2011

Обычно вы должны использовать строки форматирования вместо оператора + для конкатенации в python. Я также не уверен, почему вы хотите передать строку, для которой у вас уже есть значение точки, в функцию, которая извлекает значение точки?

Вы могли бы попробовать что-то вроде этого (хотя я не уверен, почему то, что у вас есть, не получится ..)

mystr = "Player 1: %d" % player1points
print points(mystr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...