Python字典和列表

3

我正在编写用于解释玩“克鲁推理游戏”时收集到的数据的Python代码。在代码的特定部分,我正在根据卡片所属的集合将一组卡片添加到三个不同的集合之一中。此时,我已经有一个包含6张卡片的列表,就像这样...

standby_list = ['Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall']

这是我试图加入手牌的六张卡片。此外,我已经有了一个包含三名参与游戏的玩家及其“玩家编号”配对的字典,例如...

players = {"Billy" : "Player 0", "Bob" : "Player 1", "Joe" : "Player 2"}

最后,有三个空集,每个玩家的卡牌都有一个集合...
player0_cards = set()
player1_cards = set()
player2_cards = set()

我的目标是(1)确定这三个空集合中哪一个对应于我(Bob)手中的牌,以及(2)将我的六张牌列表添加到该集合中。

我现在有的代码看起来不好且“非Pythonic”,如下所示。

standby_list = ['Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall']

player0_cards = set()
player1_cards = set()
player2_cards = set()

players = {"Billy" : "Player 0", "Bob" : "Player 1", "Joe" : "Player 2"}

if players['Bob'] == 'Player 0':
    for card in standby_list:
        player0_cards.add(card)
elif players['Bob'] == 'Player 1':
    for card in standby_list:
        player1_cards.add(card)
elif players['Bob'] == 'Player 2':
    for card in standby_list:
        player2_cards.add(card)

也许这是我想让程序执行所需的最佳编码方式,如果不是,请告诉我。

谢谢......


2
你做得还不错! - ababuji
3个回答

2

一种Pythonic的解决方案是使用字典来存储变量数量可变的变量。不要试图给每个变量命名,而是将相似的变量分组成键值字典映射。

同时请注意,您可以使用set.update代替逐个将列表中的每个项添加到集合中。

以下是一个示例。请注意,我们可以直接将players ['Bob']返回的值提供给cards字典。由于这将返回一个set,因此我们可以在结果上使用set.update

standby_list = ['Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall']

players = {"Billy" : "Player 0", "Bob" : "Player 1", "Joe" : "Player 2"}
cards = {'Player 0': set(), 'Player 1': set(), 'Player 2': set()}

cards[players['Bob']].update(standby_list)

print(cards)

{'Player 0': set(),
 'Player 1': {'Candlestick', 'Hall', 'Mustard', 'Plum', 'Revolver', 'Study'},
 'Player 2': set()}

1
如何尝试这样的东西?
standby_list = ['Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall']
players = {"Billy" : "Player 0", "Bob" : "Player 1", "Joe" : "Player 2"}

cards = {'Player 0': set(), 'Player 1': set(), 'Player 2': set()}

cards[players['Bob']].add(tuple(standby_list))
print (cards[players['Bob']])
# {('Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall')}

问题在于我将向与Bob的牌对应的集合中添加一个元组。因此,在程序/游戏后期当我评估其他玩家所做的“指控”时,如果我试图确定单张牌是否在我的手中,它将返回一个错误值,因为事实证明整个六张牌的元组在我的手中。我认为@jpp是正确的,但还是谢谢你的建议! :) - ZackBoi

1
你可以将standby_list初始化为一个集合(因为卡牌是唯一的),将players初始化为一个列表,并使用列表推导式生成player_cards,使其更符合Python风格。指定“Player 1”,“Player 2”和“Player 3”是多余的,因为列表索引本身就能代表玩家编号。
standby_list = {'Mustard', 'Plum', 'Revolver', 'Candlestick', 'Study', 'Hall'}
players = ['Billy', 'Bob', 'Joe']
player_cards = [standby_list if player == 'Bob' else set() for player in players]

player_cards 将变为:

[set(), {'Study', 'Revolver', 'Mustard', 'Plum', 'Hall', 'Candlestick'}, set()]

您的玩家编号可以是一个整数,用于访问“player_cards”集合列表。

问题在于现在三个玩家手中似乎都有芥末、李子、左轮手枪、烛台、书房和大厅,这是不可能的。 - ZackBoi
@ZackBoi 抱歉,我没有注意到你想要将玩家“Bob”与卡片匹配。我已经相应地编辑了我的答案。请试一下。 - blhsing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接