【问题标题】:string replacement of fixed positions in pythonpython中固定位置的字符串替换
【发布时间】:2013-10-20 16:37:50
【问题描述】:

我正在尝试做一个琐事程序,但我遇到了答案问题。 我想要的是替换答案的字符以显示为提示。示例:

answer = "I am just an example"
hintwouldbe = "I a_ j___ a_ e______"
hint2mightbe = "I am j___ an e_a___e"

我不确定如何制作。尝试使用循环(for c in answer)和 string.replace 方法。还尝试了一些 re.translate 和 dicts,但我得到了非常大的代码并且难以理解。那一定是一种更轻松的方式,所以......我在这里。

您认为哪种方式最有效/更容易实现?

编辑如果我能选择替换什么位置就好了。例如:如果单词有 6 个字符,则将 1,3 和 6 个字符替换为 _

Edit2:正确答案

稍作改动后,我选择 Thomas Orozco 答案为有效,很容易理解和重新创建:

    from random import random
    answer = "anything in here"
    pista = [char if random() < 0.8 else "_" for char in answer]
    pista2 = "".join(pista)
    print(pista2)

【问题讨论】:

    标签: python string replace


    【解决方案1】:

    字符串不适合表示您正在尝试做的事情,列表会更好。

    import random
    
    def make_hint(chars, frequency):
        hint_chars = [char if random.random() < frequency else "_" for char in chars]
        return "".join(hint_chars)
    
    answer = "I am just an example"
    
    print make_hint(answer, 0.3)
    print make_hint(answer, 0.5)
    

    当然,这只是一个例子。在这里,我使用随机来显示 30% 或 50% 的字符,但您可以使用不同的实现。

    请记住,在运行转换之前,您可以先调用 .split() on answer 以将其拆分为单词:

    print " ".join(make_hint(word, 0.3) for word in answer.split())
    

    【讨论】:

      【解决方案2】:

      您应该将您想到的逻辑(如在您的示例中,用 6 个字母的单词替换 1-st、3-rd 和 6-th)放入结构(例如字典)中。然后,将句子分成单词并将您的逻辑应用于它们。 这是用_交换单词中所需位置的函数:

      def exchange(word,positions):
          chars=list(word)
              w=""
          for i in range(1,len(chars)+1):
              if i in positions:
                  w+='_'
              else:
                  w+=chars[i-1]
          return w
      

      将逻辑放入字典(7 - 捕捉单词'example',4捕捉'just'):

      d={7:[1,3,6],4:[range(2,4+1)]}
      

      最后应用逻辑:

      words=answer.split() # split the sentence into word
      ' '.join(map(lambda x: exchange(x,d.get(len(x),[])),words)) # apply the logic and join results
      >>> 'I am j___ an _x_mpl_'
      

      【讨论】:

        【解决方案3】:

        在指定位置替换字符:

        answer = "I am just an example"   
        ''.join('_' if i in (1,3,6) else answer[i] for i in range(0, len(answer)))
        

        为避免替换空格:

        import string
        answer = "I am just an example" 
        def pr((c,i,L)):
         if (i in L and c in string.letters + string.digits):
          return '_'
         else:
          return c
        
        ''.join(map(pr,((answer[i],i,(1,3,6)) for i in range(len(answer)))))
        

        随机(假设您不想替换空格):

        answer = "I am just an example"
        import string
        import random
        ''.join('_' if random.randint(0, 1) and i in string.letters + string.digits else i for i in answer)
        

        【讨论】:

          【解决方案4】:

          此方法会自动将每个单词的第一个字母以外的所有字母替换为“_”,然后允许基于索引的提示字母重新填充。它使用三个列表推导:

          def hint(a, hidxs):
              return ''.join(c[i in idxs] for i, c in enumerate(a))
          
          a = zip(' '.join(w[0] + '_'*(len(w)-1) for w in answer.split()), answer)
          _idxs = [i for i, c in enumerate(hint(a, [])) if c == '_']
          

          以下是它们的使用方法:

          >>> answer = "I am just an example"
          >>> a = zip(' '.join(w[0 ]+ '_'*(len(w)-1) for w in answer.split()), answer)
          >>> _idxs = [i for i, c in enumerate(hint(a, [])) if c == '_']
          >>> _idxs #list of indexes for every '_'
          [3, 6, 7, 8, 11, 14, 15, 16, 17, 18, 19]
          >>> hidxs=[]
          >>> print 'Hint 1:', hint(a, hidxs)
          Hint 1: I a_ j___ a_ e______
          >>> hidxs=[6]
          >>> print 'Hint 2:', hint(a, hidxs)
          Hint 2: I a_ ju__ a_ e______
          >>> hidxs=[6, 14]
          >>> print 'Hint 3:', hint(a, hidxs)
          Hint 3: I a_ ju__ a_ ex_____
          >>> hidxs=[6, 14, 17]
          >>> print 'Hint 4:', hint(a, hidxs)
          Hint 4: I a_ ju__ a_ ex__p__
          >>> print 'Answer:', hint(a, _idxs)
          Answer: I am just an example
          

          随机提示的程序是:

          from random import shuffle
          def hint(a, hidxs):
              return ''.join(c[i in idxs] for i, c in enumerate(a))
          
          def all_hints(answer):
              a = zip(' '.join(w[0 ]+ '_'*(len(w)-1) for w in answer.split()), answer)
              _idxs = [i for i, c in enumerate(hint(a, [])) if c == '_']
              shuffle(_idxs)
              hints = []
              print 'Press enter for next hint:'
              for i in _idxs:
                  print 'Hint:', hint(a, hints),
                  hints.append(i)
                  raw_input()
              print 'Answer:', hint(a, hints)
          

          【讨论】:

            猜你喜欢
            • 2017-09-09
            • 2021-12-28
            • 2014-08-19
            • 2021-01-27
            • 1970-01-01
            • 1970-01-01
            • 2021-09-17
            • 2017-09-17
            • 1970-01-01
            相关资源
            最近更新 更多