【问题标题】:Create new words from start word python从开始词python创建新词
【发布时间】:2015-02-12 20:43:57
【问题描述】:
def make_new_words(start_word):
    """create new words from given start word and returns new words"""
    new_words=[]
    for letter in start_word:
        pass    
        #for letter in alphabet:
        #do something to change letters
        #new_words.append(new_word)

我有一个三个字母的单词输入,例如作为起始词的 car。 然后我必须通过用字母表中的每个字母一次替换一个字母来创建新单词。使用我的示例汽车,我想创建单词 aar、bar、car、dar、ear、...、zar。然后创建单词 car、cbr、ccr、cdr、cer、...、czr。最后是caa、cab、cac、cad、cae、...、caz。

我真的不知道 for 循环应该是什么样子。我正在考虑创建某种字母列表并循环创建新单词,但我不知道如何选择应该保留原始单词的哪些部分。新词可以附加到要返回的列表中。

【问题讨论】:

    标签: python string replace


    【解决方案1】:
    import string
    
    def make_new_words(start_word):
        """create new words from given start word and returns new words"""
        new_words = []
        for i, letter in enumerate(start_word):
            word_as_list = list(start_word)
            for char in string.ascii_lowercase:
                word_as_list[i] = char
                new_words.append("".join(word_as_list))
    
        return new_words 
    

    【讨论】:

    • 可能想把string.lowercase改成string.ascii_lowercase
    【解决方案2】:

    lowercase 只是一个包含小写字母的字符串...

    我们想改变原始单词的每个字母(这里是w)所以我们 迭代w 的字母,但我们主要需要字母的索引,所以我们在enumerate(w) 上执行for 循环。

    首先,在python中字符串是不可变的,所以我们从w构建一个列表x...列表是可变的

    现在是小写字母的第二个内部循环:我们相应地更改x 列表的当前元素(更改了x,我们需要在下一个内部循环之前重置它),最后我们打印它。

    因为我们要打印字符串而不是列表中的字符,所以我们使用空字符串''join 方法将x 的元素粘合在一起,当然,使用空字符串。

    我还没有报告输出,但这正是您要求的,请尝试...

    from string import lowercase
    
    w = 'car'
    for i, _ in enumerate(w):
        x = list(w)
        for s in lowercase:
            x[i] = s
            print ''.join(x)
    

    【讨论】:

      【解决方案3】:
      import string
      all_letters = string.ascii_lowercase
      def make_new_words(start_word):
          for index, letter in enumerate(start_word):
              template = start_word[:index] + '{}' + start_word[index+1:]
              for new_letter in all_letters:
                  print template.format(new_letter)
      

      【讨论】:

        【解决方案4】:

        您可以使用两个循环来执行此操作,即循环遍历单词,然后遍历所有字母的范围。通过为第一个循环保留索引,您可以使用切片来构造新字符串:

        for index in enumerate(start_word):
            for let in range(ord('a'), ord('z')+1):
                new_words.append(start_word[:index] + chr(let) + start_word[index+1:])
        

        【讨论】:

          【解决方案5】:

          这可能是一种蛮力方法,尽管当您尝试使用较长的单词时可能会遇到一些性能问题。

          听起来您可能只想将它限制在某个时刻存在于字典中的单词,这完全是另一回事。

          但是现在,对于三个字母的单词,你走在了正确的轨道上,尽管我担心这个问题对于 Stack Overflow 来说可能有点过于具体。

          首先,如果你循环遍历单词而不是字母的索引,你可能会更成功:

          alphabet = 'abcdefghijklmnopqrstuvwxyz'
          for i in range(len(start_word)):
          

          然后,您可以使用slice 来抓取索引前后的字母。

            for letter in alphabet:
              new_word = start_word[:i] + letter + start_word[i + 1:]
          

          上面给出了另一种方法,它将字符串转换为列表。这解决了 Python 不允许简单地设置 start_word[i] = letterwhich you can read about here 的事实。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-30
            • 1970-01-01
            • 2011-09-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多