计算重复出现两次以上的重复字符

时间:2018-11-04 16:06:40

标签: python

自从我在Code Academy上学习完Python之后,我就开始制作一个完整的Hangman项目,这是我的第一个独立项目。 (Github:https://github.com/jhern603/Python-Hangman

当前,它能够识别字符串中的重复出现的字符,但是如果发生两次以上,则不会计算重复字符的额外次数。

例如,如果用户选择“电影”作为类别,并且程序选择“全金属外套”,它将计为两个“ l”,但之后不计任何其他“ l”,从而使程序位于除非用户故意犯错,否则用户将无法完成它的状态。 这就是控制台上的样子(打印出猜中的字母数组):


选择一个字母:k

'K'是正确的。

完成任务


有问题的块

... def word_selector(self, category): if category in self.words: self.properCategory = True print("\nYou selected: '" + category + "' as the category for this round.\n") self.picker = random.randint(0, len(self.words[category])) - 2 self.selected_category = self.words[category] self.word = self.selected_category[self.picker].lower() self.word_=self.word.replace(' ','') self.word_sorted=sorted(self.word_) self.counter = collections.Counter(self.word) self.isAlpha = True ...

... def correct(self): if self.user_choice in self.word and len(self.guessed_correctly) <= len(self.word): self.guessed_correctly.append(self.user_choice) if self.user_choice in self.charRepeated: self.guessed_correctly.append(self.user_choice) print("\n'"+self.user_choice.upper() + "' was correct.\n") print(' '.join(self.guessed_correctly))

2 个答案:

答案 0 :(得分:3)

from collections import Counter

Counter(word)

您可以使用pythons Counter来计数每个字符在一个单词中出现的次数。从那里很容易滤除多​​次发生的事件。

例如,在您的情况下,您可以使用以下内容:

word = "full metal jacket"
counts = Counter(word)

recurring = {k:v for k, v in counts.items() if v > 1}

这将为您提供:

{'e': 2, 't': 2, ' ': 2, 'a': 2, 'l': 3}

答案 1 :(得分:0)

我只需遍历所有地方并替换猜测字母即可。这是一个愚蠢的,效率低下的工作代码,只是为您提供了一种可行的方法。

import random
import re

class Hang:

    def __init__(self):
        print('Hello Hangma: \n')


    def replacer(self):
        if not self.position:
            self.position = []

        while self.guess in self.selected:
            self.position.append(self.selected.index(self.guess))
            self.selected = self.selected.replace(self.guess,'_',1)
        return self.position

    def hang(self):
        self.guess = input('\nGuess a letter:\n')
        assert len(self.guess)==1
        #do something
        if self.guess in self.selected:
            self.position = self.replacer()

            for i in self.position:
                self.dash = f'{self.dash[:i]}{self.guess}{self.dash[i+1:]}'
        else:
            print(f'Nope! {self.guess} is not there')

        self.position = []  
        print(self.dash)
        return self.dash

    def play(self):
        self.category = {'movies':['full metal jacket','rambo','commando']}

        self.selected = random.choice(self.category['movies'])
        self.dash = re.sub('\w','_',self.selected)

        self.position = None

        print(f'Hit:\n{self.dash}')
        while '_' in self.dash:
            self.dash = self.hang()


if __name__=='__main__':
    game = Hang()
    game.play()

我所做的工作创建了三个功能。游戏只是调用其余部分的主要部分。 replacer是一个函数,它替换字母在单词中出现的所有位置,并挂起调用replacer函数的作用。现在,您可以添加尝试次数,并建立一个子手。目前没有限制;)