【问题标题】:Loading a dictionary using nested for loops in python在python中使用嵌套的for循环加载字典
【发布时间】:2012-08-02 00:52:10
【问题描述】:

我刚学python(有VBA背景)。

为什么这本词典没有加载?我正在尝试制作一副完整的纸牌。

这是我的代码:

class Deck:
    def load_deck(self):
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = (2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "King", "Ace")
        full_deck={}
        for s in suite:
            for r in rank:
                full_deck.setdefault(s,r)
        return full_deck
raw_deck = Deck()
raw_deck1 = raw_deck.load_deck()
print raw_deck1

这是我的输出:

{'Hearts': 2, 'Clubs': 2, 'Spades': 2, 'Diamonds': 2}

【问题讨论】:

  • 这不是应该如何使用 setdefault...d.setdefault(s,[]).append(r) 是你想要的
  • 你想要什么输出?
  • 我正在尝试创建一本包含一副完整纸牌的字典。
  • 如果您想要 52 对,则必须更改您的密钥。 . .在字典中,一个键只能有一个值。 . .所以按照你目前的方式,'Hearts' 只能有一个值。 . .如果你想要 52 对,你需要像 {'H2':2, 'H3':3, 之类的东西。 . . }
  • 啊....有趣....因为我的方式重复了键..我需要一个完全独立的键用于整个甲板 0 到 51。是吗?

标签: python list dictionary for-loop


【解决方案1】:

JBernardo 的评论为您提供了 setdefault() 的正确用法,但您可以将循环简化为以下内容:

full_deck = {}
for s in suite:
    full_deck[s] = rank

或者如果你想要一个列表而不是一个元组,使用list(rank)

单线:

full_deck = {s: rank for s in suite}

Python 2.6 或以下:

full_deck = dict((s, rank) for s in suite)

【讨论】:

  • 这将创建分隔列表,而不是单个字典对。
  • @dwstein - 这应该创建一个看起来像{'Hearts': (2, 3, 4, ...), 'Clubs': (2, 3, 4, ...), ...}的字典
  • 在你的单线中,我认为你需要做s: rank[:],否则所有的套装都将具有与它们的值相同的列表。在尝试洗牌或发牌时,这可能会成为一个问题。
  • @PaulMcGuire - 这无关紧要,因为rank 是一个元组。如果rank 是一个肯定会导致问题的列表。我想你可能会争辩说拥有一个不可变的卡片组并不是很有用,所以也许s: list(rank) 是最好的。
【解决方案2】:

您正在创建的方法实际上并不需要在一个类中 - 取决于您要执行的操作...如果您只是尝试填充字典,那么您可以分配值而不是使用setdefault() 方法(如上所述)。

你可以这样做:

cards = {}
for suit in ('Heart', 'Club', 'Spade', 'Diamond'): 
    cards[suit] = range(2, 11) + ['Jack', 'Queen', 'King', 'Ace']
print cards

如果你试图用信息填充一个新的类类型,那么你应该定义一个 init 函数(它在 Python 中充当类构造函数)来创建和存储新的成员变量,即:

class Deck:
    def __init__( self ):
        self._cards = {}
        for suit in ('Heart', 'Club', 'Spade', 'Diamond'):
            self._cards[suit] = range(2, 11) + ['Jack', 'Queen', 'King', 'Ace']

    def cards( self ):
        return self._cards

deck = Deck()
print deck.cards()

【讨论】:

【解决方案3】:

这是在支持字典推导的 Python 2.7 中执行此操作的有效方法:

def load_deck():
    suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
    rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
    return {item[0]:item[1] for item in enumerate(((r,s) for r in rank for s in suite))}

对于 Python 生成器表达式 和 dict 类构造函数,如下所示:

def load_deck():
    suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
    rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
    return dict((item[0],item[1])
                for item in enumerate(((r,s) for r in rank for s in suite)))

【讨论】:

    【解决方案4】:

    使用来自@ernie 的回复指出我需要一个带有单个键的字典,用于 52 个单独的对,我想出了以下内容,它可以满足我的需求。

    def load_deck():
        suite = ('Spades', 'Hearts', 'Diamonds', 'Clubs')
        rank = ('2', '3', '4', '5', '6', '7', '8', '9', '10', "Jack", "Queen", "King", "Ace")
        full_deck = {}
        i = 0
        for s in suite:
            for r in rank:
                full_deck[i] = r,s  # took this solution from the comment below.  it works.
                i += 1
        return full_deck
    print load_deck()
    

    【讨论】:

    • 您正在创建的字典只是由 0..51 范围内的整数键入。您不需要使用setdefault() 来填充它,而且您根本不需要deck_list 变量——只需将full_deck[i] = r,s 后跟i += 1 放在内部循环中,这将设置值与返回的字典中的每个索引相关联。有一些更短的方法可以使用字典理解来编写这样的循环,就像提到的其他一些答案一样。
    猜你喜欢
    • 2021-12-03
    • 2021-12-03
    • 2020-09-13
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2017-01-03
    • 2021-07-25
    相关资源
    最近更新 更多