我在解决下面的问题时遇到了一些麻烦(我对如何解决问题的想法直接在问题的下方)
“罗伯特麦克洛斯基的书”Make Way“ 对于小鸭子来说,这个名字 小鸭是Jack,Kack,Lack,Mack, 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'来横向字符串来创建一个条件,如果索引等于字符串的长度,则条件为false,并且不执行循环体。我想我需要修改for循环,这样如果输出字符数小于输入的原始字符串值,它会添加字母'U'。如何关联为每个名称和'前缀'输入的字符串值的长度?
我不确定如何做到这一点,或者我是否应该采取不同的策略。
我提前道歉我已经诅咒了任何术语,我已经进入这本书两天了,而且我之前没有计算机科学背景。
答案 0 :(得分:3)
>>> 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
答案 1 :(得分:3)
我的解决方案是:
prefixes = list('JKLMNP')
prefixes.extend(['Ou', 'Qu'])
suffix = 'ack'
for pref in prefixes:
print pref + suffix
它非常紧凑,只包含很少的原始修改。
答案 2 :(得分:3)
我刚做了这个练习,来到这里看看别人是怎么做到的。在我的第2版中,这是关于索引和字符串模块的章节的一部分,所以我在我的nutso解决方案中大量使用它们。基本上我将“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
答案 3 :(得分:2)
我认为你是在思考这个问题。您只需要在循环内检查当前字母是O还是Q,如果是,则添加U。
答案 4 :(得分:1)
suffix = 'ack'
prefixes = list('JKLMNP')
prefixes += ['Qu', 'Ou']
prefixes.sort()
for prefix in prefixes:
print prefix + suffix
答案 5 :(得分:1)
我喜欢数据驱动的代码:
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 :(得分:1)
我更喜欢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'是唯一的非空元素,它们落在最终结果的正确位置。
这使得三个迭代(思考列表,但字符串也计数),其中所有部分排列在正确的插槽中。这足以让您可以将旧循环换成拉链,这可能不是练习的目的,但仍然是一种pythonic技术。现在你只需要在三个拉链上运行拉链,当然这就是拉链功能。
唯一的缺点是zip为你提供了一个字符串对的列表,我们想要整个字符串,这就是'.join的用途。它们由列表理解处理,如果您还不知道,您肯定想要学习:
result = [''.join(pair) for pair in zip(infixes, suffixes)]
result = [''.join(pair) for pair in zip(prefixes, result)]
剩下的就是打印:
print '\n'.join(result)
用一个伟大的人来解释我的免责声明:理论上,我可以证明这段代码的正确性,但我没有运行它,所以可能存在错误。
答案 7 :(得分:1)
我本人只是遇到了这个问题,然后在网上检查了其他人的情况。我的看起来像这样:
prefixes = "JKLMNOPQ"
prefixes = list(prefixes)
prefixes[5] = "Ou"
prefixes[7] = "Qu"
suffix = "ack"
for p in prefixes:
print(p + suffix)
答案 8 :(得分:0)
作为一个Perl家伙,我忍不住给你一个比其他人更短的解决方案:p
prefixes = 'JKLMNOPQ'
suffix = 'ack'
for letter in prefixes:
if letter in ('O','Q'):
letter+="u"
print letter+suffix
PS:我认为练习是修改给定的代码而不是修改它,否则有一些方法可以在PEP8的范围内进一步缩小它,即:)
答案 9 :(得分:0)
它可以工作,但是使用if
的其他代码看起来更好:
prefixes = 'JKLMNP'
prefixess = 'OQ'
suffix = 'ack'
for letter in prefixes:
print(letter + suffix)
for letter in prefixess:
print (letter + 'u' + suffix)
答案 10 :(得分:0)
prefixes = "JKLMNOPQ"
suffix = "ack"
for l in prefixes:
if l == "Q" or l == "O":
print(l + "u" + suffix)
else:
print(l + suffix)
试试这个!
答案 11 :(得分:0)
与此处的其他答案相同,通读本书,解决它然后来到这里比较答案。 我的解决方案是只将前缀更改为列表,而没有其他更改:
prefixes = ["J", "K", "L", "M", "N", "Ou", "P", "Qu"] #originally "JKLMNOPQ"
suffix = "ack"
for letter in prefixes:
print(letter + suffix)