使用特殊对键初始化Python字典

时间:2014-09-19 17:19:16

标签: python list dictionary tuples list-comprehension

我正在使用Python制作一个刽子手游戏,我认为跟踪当前单词的好方法是字典。每个字母都会被一个键捕获,其中布尔值表示玩家是否猜到了该字母。

为简单起见,我假设唯一允许的输入是猜测(即,即使玩家立刻知道这个词,他或她必须[正确]填写空白)。因此,每次猜测(如果该人尚未悬挂),我将检查字典值是否全部为True,在这种情况下玩家获胜。

两个问题:

  1. 上述表示听起来合理吗?

  2. 如果是这样,则存在生成密钥以解决重复字母的问题。我想过使用元组;例如,这是“编程”一词的初始表示

  3. ('p', 0) : False
    
    ('r', 0) : False
    
    ('o', 0) : False
    
    ('g', 0) : False
    
    ('r', 1) : False
    
    ('a', 0) : False
    
    ('m', 0) : False
    
    ('m', 1) : False
    
    ('i', 0) : False
    
    ('n', 0) : False
    
    ('g', 1) : False
    

    该对中的第二项只是该字母出现的索引;因此,当我遍历单词时,第一项仍可用于标记正确猜测的字母。

    给一个单词作为字符串,是否有一种紧凑的方式来创建如上所述的字典?我可以看到这样的事情:

    word = "programming"
    word_dict = { (letter, ???) : False for letter in word } 
    

    ,哪里???是一些聪明的计数表达。或者我是否需要明确地执行此操作并在循环中跟踪事物?

2 个答案:

答案 0 :(得分:2)

你的问题太复杂了;所有你真正需要的是一个包含TrueFalse的字典;如果一封信重复或者没有重复,那么一旦玩家猜到了他们猜到该信的所有重复的信件。

创建字典很简单:

word_dict = dict.fromkeys(word, False)

这会创建一个字典,每个唯一字母都有一个键,每个字段默认为False

然后玩刽子手就像:

guessed = set()
misses = 0

while misses < 6:
    if guess in guessed:
        # already guessed at this before
        # error message, user must try again
        continue

    guessed.add(guess)
    if guess not in word_dict:
        # wrong guess
        # hang the user some more
        misses += 1
    else:
        word_dict[guess] = True
        display = ''.join([c if word_dict[c] else '_' for c in word])
        print 'Guessed so far: {}'.format(display)
        if all(word_dict.values()):
            # guessed the whole word!
            # show congratulations
            break
else:
    # player died, show commiserations 

答案 1 :(得分:1)

>>> from collections import Counter
>>> word = 'programming'
>>> c = Counter(word)
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})

您可以使用它来执行类似

的操作
dead = 5    # maximum number of incorrect guesses
missed = 0  # current number of incorrect guesses
while missed < dead:
    guess = raw_input("guess a letter")
    if c.get(guess):
        # they guessed a correct letter, display something nice :)
        # more importantly, keep track of how much of the word they correctly know
    else:
        missed += 1
        print guess, "not a letter in the word"