我刚刚开始学习 python,我有一个让我困惑的练习:创建一个可以打包或解包一串字母的函数。所以 aaabb 将被打包 a3b2 ,反之亦然。
对于函数的打包部分,我写了以下
def packer(s):
if s.isalpha(): # Defines if unpacked
stack = []
for i in s:
if s.count(i) > 1:
if (i + str(s.count(i))) not in stack:
stack.append(i + str(s.count(i)))
else:
stack.append(i)
print "".join(stack)
else:
print "Something's not quite right.."
return False
packer("aaaaaaaaaaaabbbccccd")
这似乎一切正常。但是作业说如果输入(例如)在 b 或 c 之后有字母 a,那么它应该稍后被解压缩成它的原始形式。所以“aaabbkka”应该变成a3b2k2a,而不是a4b2k2。因此我想,我不能使用“count()”命令,因为它会计算整个字符串中所有出现的项目,对吗?那么我在这里的选择是什么?
开始拆包——我已经想到了我的代码需要做的基础知识——
- 在“ if s.isalpha():” 和 else 之间,我应该添加一个 elif 来检查字符串中是否包含数字。(我认为这足以确定它是打包版本还是未打包版本)。
创建一个 for 循环并在其中创建一个 if 语句,然后检查每个元素:
2.1。如果它后面有一个数字 > 返回(或添加到一个空堆栈)该数字乘以数字
2.2。如果它后面没有数字 > 只返回元素。
大问题 2 - 我如何检查它是数字还是列表中元素后面的另一个字母元素?我想这必须通过切片来完成,但那些只取整数。这可以通过 index 命令实现吗?
另外 - 如果这有任何相关性 - 到目前为止,我基本上已经涵盖了列表、字符串、if 和 for 并且我被告知这个练习只对那些是可行的(......所以如果你不介意保持这个真的基本的)
感谢新手爱好者的所有帮助!
解决了:
def packer(s):
if s.isalpha(): # Defines if unpacked
groups= []
last_char = None
for c in s:
if c == last_char:
groups[-1].append(c)
else:
groups.append([c])
last_char = c
return ''.join('%s%s' % (g[0], len(g)>1 and len(g) or '') for g in groups)
else: # Seems to be packed
stack = ""
for i in range(len(s)):
if s[i].isalpha():
if i+1 < len(s) and s[i+1].isdigit():
digit = s[i+1]
char = s[i]
i += 2
while i < len(s) and s[i].isdigit():
digit +=s[i]
i+=1
stack += char * int(digit)
else:
stack+= s[i]
else:
""
return "".join(stack)
print (packer("aaaaaaaaaaaabbbccccd"))
print (packer("a4b19am4nmba22"))
所以这是我的最终代码。几乎只用 for 循环和 if 语句就能完成这一切。最后,虽然我不得不引入 while 循环来解决读取多位数字的问题。我想我仍然设法保持它足够简单。感谢一吨毫驼鹿和其他所有人的参与!