将.find用于字符串中的多个字母

时间:2013-08-16 14:48:15

标签: string python-2.7 find

我正在做一个爱好项目。我正在尝试用Python制作一个刽子手游戏。到目前为止一切都很好。只有一个问题。如果我输入两次出现在单词中的字母,我就无法显示第二个字母。我一直在使用string.find和string.count方法,但无济于事。有谁知道我会怎么做呢?我很难过。

#!bin/bash/python

import os
import time

word = 'megalopolis'
l = len(word)
list = []
n=0
while n!=l:
    list.append('-')
    n+=1
os.system('cls' if os.name=='nt' else 'clear')
print list

i=3

while i!=0:
    x = raw_input('Enter a letter: ')
    if x in word and x!='':
        print 'Good choice!'
        count=word.count(x)
        loc=word.find(x)
        print count 
        print loc 
        list[loc]=x
        os.system('cls' if os.name=='nt' else 'clear')
        if '-' not in list:
            break
        print list
    else:
        print 'Sorry...'
        i-=1
        if i==2:
            print 'You have '+`i`+' more chances.'
        if i==1:
            print 'You have '+`i`+' more chance!'
        time.sleep(1)
        os.system('cls' if os.name=='nt' else 'clear')
        print list

if '-' not in list:
    print 'YOU WIN!!'
else:
    print 'GAME OVER!!'

x = raw_input('press enter')

3 个答案:

答案 0 :(得分:2)

如果你只需要每个角色出现的索引:

indexes = [idx for idx, ch in enumerate(word) if ch == x]

也许您应该使用Unidecode将重音保留在单词中,根据语言(如果不是英语)可能会有用。此外,您可以使用str.lower()str.upper()方法确保每个单词和试用版都是相同的。

string module为您提供了有用的常量(例如ascii_uppercase)。

然而,在这个游戏中你不需要担心任何索引。我为你做了另一个版本:

#!/usr/bin/env python
from string import ascii_uppercase

word = "megalopolis".upper() # Top-secret!
trial = 3 # Total trials available (number of mistakes to lose the game)
typed = set() # Typed characters
word_letters = set(word)

while trial:
    print
    print "".join(ch if ch in typed else "-" for ch in word)

    # Winning condition
    if typed.issuperset(word_letters):
        break

    # Data input
    x = raw_input("Enter a letter: ").upper()

    # Error cases
    if len(x) != 1:
        print "Invalid input."
        continue
    if x in typed:
        print "Already typed."
        continue
    if x not in ascii_uppercase:
        print "What you typed isn't a letter."
        continue

    # Valid data cases
    typed.add(x)
    if x in word:
        print "Good choice!"
    else:
        print "{} not found!".format(x),
        trial -= 1
        if trial == 1:
            print "You have one more chance!"
        elif trial > 1:
            print "You have {} more chances.".format(trial)
        else:
            print 'Sorry...'

# Ending message
print
if trial:
    print "YOU WIN!!"
else:
    print "GAME OVER!!"
  1. Hashbang:你的shebang通常应以“#!/”开头。您可能正在使用Windows,因此您没有使用“bin”作为相对目录。
  2. “l”/ l应该避免变量名!它可能被视为一个或更低的“L”(PEP8),甚至是管道“|”。 PS:在这个项目的开头,我在这里输入了两次相同的字母。
  3. 这里没有必要使用“list”作为变量名,你不应该这样做,因为这是一个内置名称。
  4. 像“txt”* 3这样的乘法为字符串和列表返回“txttxttxt”(它重复数据)
  5. “cls”和“clear”都没有在这里工作,显示

      

    “未设置TERM环境变量。”

    而不是清除控制台屏幕。我用空的替换了这些 “打印”,并删除了睡眠时间。如果你想从控制台调用某些内容,请查找subprocess(如果需要进行CLI可视化,我也会查找curses。)

  6. 假设x是一个字符串。如果x == ""bool(x)False,则bool(x)True
  7. 假设x是一个整数。如果x == 0bool(x)False,则bool(x)True
  8. 避免反引号(`)。今天没有人在Python中使用它们,它们在Python 3中不存在,您可以使用repr内置代替。但是,您可能想要str(trial)"%d" % trial"{}".format(trial)
  9. 最后一次“按回车”可能与操作系统“自动关闭 - 完成后”行为有关,但您[至少]不需要将其存储在x中。
  10. 我使用了生成器表达式。如果一行中间的“for”让您感到困惑,您应该阅读here关于列表推导的内容。 Python开发人员一直使用生成器表达式和列表推导,你不应该避免了解它们。
  11. 我将原来的获胜评价替换为该词最初具有的字符集与键入字符集(均为大写字母)之间的比较。
  12. 如果您有不明白的地方,请提出新问题。

答案 1 :(得分:1)

这个问题应该适合你:

Finding multiple occurrences of a string within a string in Python

它应该对单个字符和字符串一样有效,考虑从第一个字符构成第二个字符的容易程度。

答案 2 :(得分:0)

所以最后,我结束了这样做:

    if x in word and x!='':

        count=word.count(x)
        loc=0
        while count==1 or count>1:
            loc=word.find(x,loc)
            list[loc]=x
            loc+=1
            count-=1  
        print 'Good choice!'

感谢大家的帮助。我确实学到了一些东西。