【问题标题】:Think Python (How to think like a computer scientist) - Excercise 8.4Think Python(如何像计算机科学家一样思考) - 练习 8.4
【发布时间】:2010-11-21 17:58:49
【问题描述】:

我在解决下面的问题时遇到了一些麻烦(我对如何解决问题的想法直接在问题的下方)

“在罗伯特麦克洛斯基的书中让路 对于 Ducklings,它们的名称 小鸭是杰克,凯克,拉克,麦克, Nack、Ouack、Pack 和 Quack。”

此循环按顺序输出这些名称:

prefixes = 'JKLMNOPQ' 
suffix = 'ack'
for letter in prefixes:
    print letter + suffix

输出是:

Jack
Kack
Lack
Mack
Nack
Oack
Pack
Qack

当然,这不太正确,因为“Ouack”和“Quack”拼写错误。

练习 8.2 修改程序来修正这个错误。”

因此,前缀 + 后缀在其当前形式中产生 4 个字符。 Ouack 和 Quack 是 5 个字符。在上一节中,我们使用 'while' 来遍历字符串以创建条件,如果索引等于字符串的长度,则条件为假,并且不执行循环体。我想我需要修改for循环,以便如果输出字符数小于输入的原始字符串值,它会添加字母'U'。如何将每个名称输入的字符串值的长度与“前缀”相关联?

我不知道该怎么做,或者我是否应该采取不同的策略。

我提前道歉,我已经扼杀了任何术语,我已经阅读这本书两天了,而且我之前没有计算机科学背景。

【问题讨论】:

  • 我认为这是一个非常人为的例子,这正是为什么计算机科学课程和书籍有时会非常愚蠢的原因。
  • 顺便说一句,您应该指定其中一个响应作为答案。

标签: python


【解决方案1】:
>>> for letter in prefixes:
        if letter in ('O', 'Q'):  # if the letter is O or Q
            print letter + 'u' + suffix
        else:
            print letter + suffix


Jack
Kack
Lack
Mack
Nack
Ouack
Pack
Quack

【讨论】:

  • 如果答案符合您的要求,请使用前面的绿色勾号表示接受。
【解决方案2】:

我的解决方案是:

prefixes = list('JKLMNP')
prefixes.extend(['Ou', 'Qu'])
suffix = 'ack'
for pref in prefixes:
    print pref + suffix

它结构紧凑,对原始版本的修改很少。

【讨论】:

    【解决方案3】:

    我刚做了这个练习,就来这里看看其他人是怎么做的。在我的第二版中,这是关于索引和字符串模块的一章的一部分,所以我在我的坚果解决方案中大量使用了它们。基本上我在前缀字符串中添加了“u”,并编写了一个 if 语句来检查字符串中的小写字母。

    import string
    def ducks():
        prefixes = "JKLMNOuPQu"
        suffix = "ack"
        index = 0
        while index < len(prefixes)-1:
            if prefixes[index+1] in string.lowercase:
            prefix = prefixes[index:index+2]
            print prefix + suffix
            index += 1
        elif prefixes[index] in string.lowercase:
            index += 1
        else:
            prefix = prefixes[index]
            print prefix + suffix
            index +=1
    

    【讨论】:

      【解决方案4】:

      我认为你想多了。您只需要在循环中检查当前字母是 O 还是 Q,如果是则添加 U。

      【讨论】:

        【解决方案5】:

        我喜欢数据驱动的代码:

        endings = ['ack', 'uack']
        specials = ['O','Q']
        prefixes = 'JKLMNOPQ'
        suffixes = dict(zip(prefixes, [endings[p in specials] for p in prefixes]))
        for letter in prefixes:
            print letter + suffixes[letter]
        

        【讨论】:

          【解决方案6】:

          作为一个 Perl 人,我忍不住给你一个比其他人更短的解决方案:p

          prefixes = 'JKLMNOPQ' 
          suffix = 'ack'
          for letter in prefixes:
           if letter in ('O','Q'):
            letter+="u"
           print letter+suffix
          

          PS:我认为练习是修改给定的代码而不是修改它,否则有办法在PEP8 的范围内进一步缩小它:)

          【讨论】:

            【解决方案7】:

            我更喜欢 Gordian Knot 方法:

            print '\n'.join(['Jack', 'Kack', 'Lack', 'Mack', 'Nack', 'Ouack', 'Pack', 'Quack'])
            

            严格来说,这只是一个(有些激进的)修改。

            就是这样,Perl 家伙。

            除了开玩笑,您可以像其他人提到的那样通过特殊的“O”和“Q”大小写来做到这一点。一种(非常)稍微更一般的方法是将额外的元音不视为一种特殊情况,而是将其视为一般情况中唯一“可见”的成员:

            suffixes = ['ack'] * 8
            prefixes = 'JKLMNOPQ'
            infixes = ',,,,,u,,u'.split(',')
            

            中缀字符串的拆分返回围绕连续逗号的空字符串,因此 'u' 是唯一的非空元素,它们位于最终结果的正确位置。

            这会生成三个可迭代对象(想想列表,但字符串也很重要),其中所有部分都排列在正确的插槽中。这是一个足够的转变,您可以将旧循环换成 zip,这可能不是练习的目的,但仍然是一种 Python 技术。现在你只需要在三个上面拉一个拉链,当然这就是 zip 函数的用途。

            唯一的问题是 zip 为您提供了一个字符串对列表,我们需要整个字符串,这就是 ''.join 的用途。它们由列表推导式处理,如果您还不知道,您肯定想了解:

            result = [''.join(pair) for pair in zip(infixes, suffixes)]
            result = [''.join(pair) for pair in zip(prefixes, result)]
            

            剩下的就是打印了:

            print '\n'.join(result)
            

            套用一位伟人的话说,我的免责声明:理论上,我可以证明这段代码的正确性,但我没有运行它,所以可能存在错误。

            【讨论】:

              【解决方案8】:
              suffix = 'ack'
              prefixes = list('JKLMNP')
              prefixes += ['Qu', 'Ou']
              prefixes.sort()
              
              for prefix in prefixes:
                  print prefix + suffix
              

              【讨论】:

              • 另一种拆分公式是prefixes = list('JKLMNP')。对我来说,这更接近我对正在发生的事情的心理模型。但你的里程可能会有所不同:)
              • 这是无效的代码,如果传递一个空字符串作为分隔符,python 的split 将引发ValueError: empty separator
              • 字符串根本不需要转换为列表就可以迭代。它已经是可迭代的了。
              【解决方案9】:

              我自己也遇到了这个问题,然后上网看看其他人是怎么做的。我的看起来像这样:

              prefixes = "JKLMNOPQ"
              prefixes = list(prefixes)
              prefixes[5] = "Ou" 
              prefixes[7] = "Qu"
              suffix = "ack"
              
              for p in prefixes:
                  print(p + suffix)
              

              【讨论】:

              • 为什么需要将string转换成list
              • 因为字符串对象是不可变的,这意味着它不支持项目分配(我在第 3 行和第 4 行所做的事情)。这就是为什么我需要事先将其转换为列表类型
              • 您可以遍历初始字符串并添加替换前缀的条件。这样,您将使用更少的内存。
              【解决方案10】:

              它可以工作,但使用 if 的其他代码看起来更好:

              prefixes = 'JKLMNP'
              prefixess = 'OQ'
              suffix = 'ack'
              
              for letter in prefixes:
                  print(letter + suffix)
              for letter in prefixess:
                  print (letter + 'u' + suffix)
              

              【讨论】:

                【解决方案11】:
                prefixes = "JKLMNOPQ"
                suffix = "ack"
                
                for l in prefixes:
                    if l == "Q" or l == "O":
                    print(l + "u" + suffix)
                else:
                    print(l + suffix)
                

                试试这个!

                【讨论】:

                  【解决方案12】:

                  和这里的其他答案一样,翻阅这本书,解决了它然后来这里比较答案。 我的解决方案是只将前缀更改为列表而不进行其他更改:

                  prefixes = ["J", "K", "L", "M", "N", "Ou", "P", "Qu"] #originally "JKLMNOPQ"
                  suffix = "ack"
                  
                  for letter in prefixes:
                      print(letter + suffix)
                  

                  【讨论】:

                    猜你喜欢
                    • 2013-05-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-01-25
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-05-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多