简体   繁体   English

从列表中删除多个元素

[英]Remove multiple elements from a List

Im having a problem with this python code:我对这个 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

In the end it should just remove one "1P", one "1C", etc but it ends up removing all them and shows an empty array.最后它应该只删除一个“1P”,一个“1C”等,但最终删除所有它们并显示一个空数组。 Anyway I can just show the remaining cards?无论如何,我可以只显示剩余的卡片吗?

The objective is having a big pool of cards, and from that big pool keep removing "cards_deck" like its forming decks until its not possible anymore.目标是拥有一大堆纸牌,然后从那个大纸牌池中不断删除“cards_deck”,就像它的形成甲板一样,直到不再可能。

How can I do this?我怎样才能做到这一点?

As @tobias_k mentioned you could use Counter :正如@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

Output输出

['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']
[]

Explanation解释

The idea is to decrease the count of each card in card_deck for each iteration of the while loop until you have no cards present in counts .这个想法是为 while 循环的每次迭代减少card_deck中每张卡片的数量,直到counts没有卡片。 When the count of a card gets to 0 remove it from counts .当卡片的计数为 0 时,将其从counts删除。

The reason for your problem is that set takes distinct elements from the list and hence you end up subtracting two sets of distinct elements which have all the elements common among them.你的问题的原因是 set 从列表中获取不同的元素,因此你最终减去两组不同的元素,这些元素具有它们之间的所有元素。 Hence your set difference is an empty set.因此你的集差是一个空集。

You can solve your problem as such.你可以这样解决你的问题。

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

EDIT :编辑 :

To find the total number of decks you can make from the cards.要找到您可以从卡片中制作的套牌总数。

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

Hope this answers your problem.希望这能解决您的问题。 I've created a new list which only consists the elements which are not present in cards_deck .我创建了一个新列表,其中仅包含cards_deck中不存在的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)

Output:输出:

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']

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM