Как заменить определенную комбинацию целого числа и строки? - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь заменить список питонов колодой карт с символами.

Я пытался использовать функцию замены Питона, но я полагаю, что лучшее решение для этого, вероятно, основано на замене регулярного выражения.

Желаемый результат будет следующим:

"Ah" => "A♥"
"5h" => "5♥"

и т.д.

В данный момент список содержит такие элементы: [Имя игрока], [Кошелек игрока], [1-я карта игрока], [2-я карта игрока]

Это может быть т. Е .:

["Don Johnson", 100, "Ks", "5d"]
["Davey Jones", 100, "4c", "3h"]

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

(Отредактировано для уточнения по запросу - Спасибо за все комментарии!)

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

Если бы у вас был только список карточек, то он бы выглядел примерно так:

cards = ['2h', '2s', '2c', '2d', '3h', '3s', '3c', '3d', '4h', '4s', '4c', '4d', '5h', '5s', '5c', '5d', '6h', '6s', '6c', '6d', '7h', '7s', '7c', '7d', '8h', '8s', '8c', '8d', '9h', '9s', '9c', '9d', '10h', '10s', '10c', '10d', 'Ah', 'As', 'Ac', 'Ad', 'Kh', 'Ks', 'Kc', 'Kd', 'Jh', 'Js', 'Jc', 'Jd', 'Qh', 'Qs', 'Qc', 'Qd']

Если это так, тогда просто используйте дикт и понимание:

suits = {'h': '♥', 's': '♠', 'c': '♣', 'd': '♦'}
new_cards = [''.join(rank)+suits[suit] for *rank, suit in cards]

Выход для этого:

['2♥', '2♠', '2♣', '2♦', '3♥', '3♠', '3♣', '3♦', '4♥', '4♠', '4♣', '4♦', '5♥', '5♠', '5♣', '5♦', '6♥', '6♠', '6♣', '6♦', '7♥', '7♠', '7♣', '7♦', '8♥', '8♠', '8♣', '8♦', '9♥', '9♠', '9♣', '9♦', '10♥', '10♠', '10♣', '10♦', 'A♥', 'A♠', 'A♣', 'A♦', 'K♥', 'K♠', 'K♣', 'K♦', 'J♥', 'J♠', 'J♣', 'J♦', 'Q♥', 'Q♠', 'Q♣', 'Q♦']

Для вашего решения вы можете определить функцию, которая исправляет карту:

def fix_card(card):
    suits = {'h': '♥', 's': '♠', 'c': '♣', 'd': '♦'}
    *rank, suit = card
    return ''.join(rank)+suits[suit]

Тогда просто используйте это так:

player = ["Don Johnson", 100, "Ks", "5d"]
player[2] = fix_card(player[2])
player[3] = fix_card(player[3])
print(player)
#["Don Johnson", 100, "K♣", "5♦"]
2 голосов
/ 04 июня 2019

Здесь мы можем просто использовать четыре простых выражения и сделать желаемую замену:

([AKJQ0-9]{1,2})h
([AKJQ0-9]{1,2})d

и аналогично двум другим.

Демо

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"([AKJQ0-9]{1,2})h"

test_str = ("Ah\n"
    "10h")

subst = "\\1♥"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.
0 голосов
/ 04 июня 2019

Нет, регулярное выражение не требуется для такой простой замены, как эта.Просто используйте str.replace:

>>> cards = ['Ah', '5h']
>>> [s.replace('h', '♥') for s in cards]
['A♥', '5♥']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...