Как найти пары в списке карт, используя python - PullRequest
2 голосов
/ 26 апреля 2020

У меня есть следующий список в python.

list = ['10♠', '10♣', '2♡', '4♠', '4♣', '5♡', '5♣', '6♡', '6♣', '7♠', '7♡', '7♢', '7♣', '8♡', '8♢', '8♣', '9♡', '9♢', '9♣', 'A♠', 'A♢', 'A♣', 'J♢', 'K♠', 'K♢', 'Q♡']

, как я могу удалить пары из этого? Например, если число появляется нечетное количество раз, последнее его появление следует сохранить. Все остальные должны быть удалены. Включая все те, которые появляются четное число раз.

ex: From '9♡', '9♢', '9♣', следует сохранить только '9♣'.

Может кто-то помогите мне с этим?

Я попытался использовать приведенный ниже код, чтобы сначала идентифицировать индексы. Но все равно не повезло.

i = 0
        while i < len(deck): 
            count = 0
            k = len(deck[i])
            pivot = i
            j = i
            while j < len(deck): 
                if deck[i][:k-1] == deck[j][:k-1]:
                    print(deck[i]+','+deck[j])
                    count+= 1 
                    pivot = j
                j+=1
            if (count %2 != 0): 
                print('pivot:'+str(pivot))
            i = pivot +1
            i +=1

Не нужно учитывать символы. Просто хочу удалить пары из списка.

Пожалуйста, предоставьте ваши предложения.

Ответы [ 4 ]

2 голосов
/ 26 апреля 2020

Это то, что вы ищете?

from collections import defaultdict
deck = ['10♠', '10♣', '2♡', '4♠', '4♣', '5♡', '5♣', '6♡', '6♣', '7♠', '7♡', '7♢', '7♣', '8♡', '8♢', '8♣', '9♡', '9♢', '9♣', 'A♠', 'A♢', 'A♣', 'J♢', 'K♠', 'K♢', 'Q♡']

# Create a dictionary and group all the cards with same number
groups = defaultdict(list)
for card in deck:
    key = card[:-1]
    groups[key].append(card)

new_deck = []
for subgroup in groups.values():
    # iterate through the dictionary
    # If you have odd number of cards in a subgroup
    # consider the last card in that subgroup
    if len(subgroup)%2 == 1:
        new_deck.append(subgroup[-1])

for card in new_deck:
    print(card)

Вывод

2♡ 8♣ 9♣ A♣ J♢ Q♡

Редактировать: Небольшое упрощение для второй итерации с groups.values, благодаря RoadRunner.

2 голосов
/ 26 апреля 2020

Сгруппируйте пары карт в collections.defaultdict, затем верните только последнюю карту из неравных пар в новый список, используя понимание списка:

from collections import defaultdict

lst = ['10♠', '10♣', '2♡', '4♠', '4♣', '5♡', '5♣', '6♡', '6♣', '7♠', '7♡', '7♢', '7♣', '8♡', '8♢', '8♣', '9♡', '9♢', '9♣', 'A♠', 'A♢', 'A♣', 'J♢', 'K♠', 'K♢', 'Q♡']

cards = defaultdict(list)
for card in lst:
    cards[card[:-1]].append(card)

result = [pairs[-1] for pairs in cards.values() if len(pairs) % 2]

print(result)

Вывод:

['2♡', '8♣', '9♣', 'A♣', 'J♢', 'Q♡']
1 голос
/ 26 апреля 2020

Сохраняя тот же порядок, вы можете использовать:

import re

l = ['10♠', '10♣', '2♡', '4♠', '4♣', '5♡', '5♣', '6♡', '6♣', '7♠', '7♡', '7♢', '7♣', '8♡', '8♢', '8♣', '9♡', '9♢', '9♣', 'A♠', 'A♢', 'A♣', 'J♢', 'K♠', 'K♢', 'Q♡']

nc, nl = [], [0]

for x in l:
    clean = re.sub(r"[^A-Z\d]", "", x)
    if clean != nl[-1]:
        nl.append(clean)
        nc.append(x)
    else:
        del nl[-1]
        del nc[-1]

print(nc)
# ['2♡', '8♣', '9♣', 'A♣', 'J♢', 'Q♡']

Демо

0 голосов
/ 26 апреля 2020

Прежде всего, list является зарезервированным ключевым словом, вы никогда не должны называть свои переменные после зарезервированных ключевых слов, используйте lst вместо list

Теперь вот минимальное решение:

lst = ['10♠', '10♣', '2♡', '4♠', '4♣', '5♡', '5♣', '6♡', '6♣', '7♠', '7♡', '7♢', '7♣', '8♡', '8♢', '8♣', '9♡', '9♢', '9♣', 'A♠', 'A♢', 'A♣', 'J♢', 'K♠', 'K♢', 'Q♡']
dictionary = dict.fromkeys(list('A23456789JQK')+['10'])   

for item in lst: 
    dictionary[item[:-1]] = item if dictionary[item[:-1]] is None else None                                                                                    

print(list(filter(None.__ne__, dictionary.values())))

вывод:

['A♣', '2♡', '8♣', '9♣', 'J♢', 'Q♡']
...