В Python я хочу кодировать так, чтобы, если пользователь вводит слово, которое в моем списке содержится более одного раза, обе строки в списке будут удалены - PullRequest
0 голосов
/ 18 июня 2019

Я хочу иметь список, подобный ["King S", "King H", "Ace S", "4 C"] и затем, когда его спросят о вводе пользователем информации о том, какую карту оставить, если пользователь пишет «король», оба короля будут исключены из списка.

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

dropCard = input()
dropCardCapital = dropCard.title()
while dropCardCapital not in pOneCards:
    print("You do not have the card " + dropCardCapital + ", please type a card that you have.")
    dropCard = input()
    dropCardCapital = dropCard.title()
if dropCardCapital in pOneCards:
        print("You dropped " + dropCardCapital)
DCCC = Counter([dropCardCapital])
pOneCards = set(pOneCardsCounter - DCCC)
pOneCardsCounter = Counter(pOneCards)

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

У меня тоже все в порядке, вместо того, чтобы делать каждую карту King H / King S, просто используйте четыре "King" и не указывайте цвет или масть.

1 Ответ

0 голосов
/ 18 июня 2019

Я сделал функцию remove_card(), где вы можете указать карту только по значению или по значению И цвет:

from collections import defaultdict

lst = ["King S", "King H", "Ace S", "4 C"]

def remove_card(card, lst):
    d = defaultdict(list)
    s = ' '.join(lst).split()
    for value, color in zip(s[::2], s[1::2]):
        d[value.lower()].append(color.lower())

    value, color = map(str.lower, card.split() if ' ' in card else (card, ''))

    dropped = []
    if value in d and color == '' and len(d[value]) > 1:
        # remove all cards of certain value only if color is unspecified and we have
        # more than one card of this value
        dropped = [(value + ' ' + v).title() for v in d[value]]
        del d[value]
    elif value in d and color != '' and color in d[value]:
        # color is specified and we have this card, remove it
        dropped = [(value + ' ' + color).title()]
        d[value].remove(color)

    # convert back defaultdict to list
    return [(k + ' ' + c).title() for k, v in d.items() for c in v], dropped

print('Initial list: ', lst)
lst, dropped = remove_card('ace', lst)  # no card is removed - we have only one Ace
print('After trying to remove "ace": ', lst)
print('We dropped: ', dropped)
lst, dropped = remove_card('ace s', lst)    # Ace S is removed - color is specified
print('After trying to remove "ace s": ', lst)
print('We dropped: ', dropped)
lst, dropped = remove_card('king', lst) # all 'kings' are removed, because we have more than one king
print('After trying to remove "king": ', lst)
print('We dropped: ', dropped)

Отпечатки:

Initial list:  ['King S', 'King H', 'Ace S', '4 C']
After trying to remove "ace":  ['King S', 'King H', 'Ace S', '4 C']
We dropped:  []
After trying to remove "ace s":  ['King S', 'King H', '4 C']
We dropped:  ['Ace S']
After trying to remove "king":  ['4 C']
We dropped:  ['King S', 'King H']
...