从列表中删除多个元素

时间:2018-10-29 11:16:32

标签: python list

此python代码有问题:

card_list = ["1P", "1C", "1O","1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", 
     "3E", "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O", 
     "6E", "7P", "7C", "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP", 
     "DC", "DO", "DE", "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE", 
     "1P", "1C", "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", "3E", 
     "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O", "6E", "7P", "7C", 
     "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP", "DC", "DO", "DE", 
     "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE", "1P", "1C", 
     "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", "3E", "4P", "4C", "4O", "4E", 
     "5P", "5C", "5O", "5E", "6P", "6C", "6O", "6E", "7P", "7C", "7O", "7E", "8P", "8C", 
     "8O", "8E", "9P", "9C", "9O", "9E", "DP", "DC", "DO", "DE", "JP", "JC", "JO", "JE", 
     "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE"]

#print all cards
print card_list

#cards from a deck
cards_deck = ["1P", "1C", "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", 
     "3E", "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O", 
     "6E", "7P", "7C", "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP", 
     "DC", "DO", "DE", "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE"]

#remove deck cards from card pool
final_card= list(set(card_list).difference(set(cards_deck)))

#print remaining cards
print final_card

最后,它应该只删除一个“ 1P”,一个“ 1C”等,但是最后删除所有它们并显示一个空数组。无论如何,我只能显示剩余的卡片?

目标是拥有大量的纸牌,并从该大纸牌中不断移除“ cards_deck”(如其成型甲板),直到不再可用为止。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

如@tobias_k所述,您可以使用Counter

from collections import Counter

card_list = ["1P", "1C", "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O",
             "3E", "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O",
             "6E", "7P", "7C", "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP",
             "DC", "DO", "DE", "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE",
             "1P", "1C", "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", "3E",
             "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O", "6E", "7P", "7C",
             "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP", "DC", "DO", "DE",
             "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE", "1P", "1C",
             "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O", "3E", "4P", "4C", "4O", "4E",
             "5P", "5C", "5O", "5E", "6P", "6C", "6O", "6E", "7P", "7C", "7O", "7E", "8P", "8C",
             "8O", "8E", "9P", "9C", "9O", "9E", "DP", "DC", "DO", "DE", "JP", "JC", "JO", "JE",
             "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE"]

# print all cards
print card_list

# cards from a deck
cards_deck = ["1P", "1C", "1O", "1E", "2P", "2C", "2O", "2E", "3P", "3C", "3O",
                  "3E", "4P", "4C", "4O", "4E", "5P", "5C", "5O", "5E", "6P", "6C", "6O",
                  "6E", "7P", "7C", "7O", "7E", "8P", "8C", "8O", "8E", "9P", "9C", "9O", "9E", "DP",
                  "DC", "DO", "DE", "JP", "JC", "JO", "JE", "VP", "VC", "VO", "VE", "RP", "RC", "RO", "RE"]

counts = Counter(card_list)

while counts:

    # remove deck cards from card pool
    for card in cards_deck:
        counts[card] -= 1
        if counts[card] == 0:
            counts.pop(card)

    final_card = [card for card in counts.elements()]

    # print remaining cards
    print final_card

输出

['1P', '1C', '1O', '1E', '2P', '2C', '2O', '2E', '3P', '3C', '3O', '3E', '4P', '4C', '4O', '4E', '5P', '5C', '5O', '5E', '6P', '6C', '6O', '6E', '7P', '7C', '7O', '7E', '8P', '8C', '8O', '8E', '9P', '9C', '9O', '9E', 'DP', 'DC', 'DO', 'DE', 'JP', 'JC', 'JO', 'JE', 'VP', 'VC', 'VO', 'VE', 'RP', 'RC', 'RO', 'RE', '1P', '1C', '1O', '1E', '2P', '2C', '2O', '2E', '3P', '3C', '3O', '3E', '4P', '4C', '4O', '4E', '5P', '5C', '5O', '5E', '6P', '6C', '6O', '6E', '7P', '7C', '7O', '7E', '8P', '8C', '8O', '8E', '9P', '9C', '9O', '9E', 'DP', 'DC', 'DO', 'DE', 'JP', 'JC', 'JO', 'JE', 'VP', 'VC', 'VO', 'VE', 'RP', 'RC', 'RO', 'RE', '1P', '1C', '1O', '1E', '2P', '2C', '2O', '2E', '3P', '3C', '3O', '3E', '4P', '4C', '4O', '4E', '5P', '5C', '5O', '5E', '6P', '6C', '6O', '6E', '7P', '7C', '7O', '7E', '8P', '8C', '8O', '8E', '9P', '9C', '9O', '9E', 'DP', 'DC', 'DO', 'DE', 'JP', 'JC', 'JO', 'JE', 'VP', 'VC', 'VO', 'VE', 'RP', 'RC', 'RO', 'RE']
['1P', '1P', 'DO', 'DO', '3P', '3P', 'JP', 'JP', '5P', '5P', 'VC', 'VC', '3C', '3C', '1C', '1C', 'JO', 'JO', '1E', '1E', '5E', '5E', 'JE', 'JE', '8E', '8E', '3E', '3E', 'JC', 'JC', '7E', '7E', '2O', '2O', '7C', '7C', '9O', '9O', '7O', '7O', '9C', '9C', '9E', '9E', 'RE', 'RE', '5C', '5C', '7P', '7P', '9P', '9P', 'RO', 'RO', 'DE', 'DE', '2P', '2P', 'VE', 'VE', 'RC', 'RC', '4P', '4P', 'DC', 'DC', 'VP', 'VP', '4O', '4O', '2C', '2C', 'RP', 'RP', '4E', '4E', '4C', '4C', '8O', '8O', '1O', '1O', '6C', '6C', '6E', '6E', 'DP', 'DP', '2E', '2E', '8C', '8C', '5O', '5O', '6O', '6O', '6P', '6P', 'VO', 'VO', '3O', '3O', '8P', '8P']
['1P', 'DO', '3P', 'JP', '5P', 'VC', '3C', '1C', 'JO', '1E', '5E', 'JE', '8E', '3E', 'JC', '7E', '2O', '7C', '9O', '7O', '9C', '9E', 'RE', '5C', '7P', '9P', 'RO', 'DE', '2P', 'VE', 'RC', '4P', 'DC', 'VP', '4O', '2C', 'RP', '4E', '4C', '8O', '1O', '6C', '6E', 'DP', '2E', '8C', '5O', '6O', '6P', 'VO', '3O', '8P']
[]

说明

想法是减少while循环的每次迭代中card_deck中每张卡的数量,直到counts中没有卡为止。当一张卡的数量变为0时,将其从counts中删除。

答案 1 :(得分:0)

出现问题的原因是set从列表中获取了不同的元素,因此最终要减去两组完全相同的元素。因此,您的集合差异是一个空集合。

您可以这样解决您的问题。

final_card = filter(None, [each if each not in cards_deck else cards_deck.remove(each) for each in card_list ])

编辑:

要查找您可以从卡片中制作的牌组总数。

from collections import Counter
card_counter = Counter(card_list)
check_if_all_cards_exist = set(card_list).difference(cards_deck)
if check_if_all_cards_exist:
   number_of_decks = min(card_counter.values())
else:
   number_of_decks = 0

答案 2 :(得分:0)

希望这可以回答您的问题。我创建了一个新列表,其中仅包含cards_deck中不存在的元素。

print("CARDLIST:",len(card_list))
print("CARD_DECK:",len(cards_deck))

final_card = [card_list[card_list.index(card)] for card in cards_deck if card in card_list]

print("AFTER DIFFERENCE:" ,len(card_list) - len(final_card))

print(final_card)

输出:

CARDLIST: 156
CARD_DECK: 51
AFTER DIFFERENCE: 105
['7E', '1P', '1C', '1O', '1E', '2P', '2C', '2O', '2E', '3P', '3C', '3O', '3E', '4P', '4C', '4O', '4E', '5P', '5C', '5O', '5E', '6P', '6C', '6O', '6E', '7P', '7C', '7O', '7E', '8P', '8C', '8O', '8E', '9P', '9C', '9O', '9E', 'DP', 'DC', 'DO', 'DE', 'JP', 'JC', 'JO', 'JE', 'VP', 'VC', 'VO', 'VE', 'RP', 'RC', 'RO', 'RE', '1P', '1C', '1O', '1E', '2P', '2C', '2O', '2E', '3P', '3C', '3O', '3E', '4P', '4C', '4O', '4E', '5P', '5C', '5O', '5E', '6P', '6C', '6O', '6E', '7P', '7C', '7O', '7E', '8P', '8C', '8O', '8E', '9P', '9C', '9O', '9E', 'DP', 'DC', 'DO', 'DE', 'JP', 'JC', 'JO', 'JE', 'VP', 'VC', 'VO', 'VE', 'RP', 'RC', 'RO', 'RE']