我想先介绍一下看和说的顺序。就像a = {1, 11, 21, 1211, 111221 ...
系统检查前一个数字并计数。
1 = one 1 (so = 11)
11 = two 1 (so = 21)
21 = one 2 one 1 (so = 1211)
作为序列的规则,任何数字都不能超过3,所以创建一个转换表就可以了。但它不是语义的,我不喜欢。
我想要的是一个脚本,它计算给定的值并返回一个类似的字符串。
但是,为了超出限制,我希望它甚至可以计算字符,这样它就可以返回1A2b41
。
我已经试着让它工作了好几个小时了,逻辑出了问题,我现在有一个大脑冻结。
这是一个实际上不起作用的脚本(返回错误的结果),但它至少可以给你一个想法。
def seq(a):
k,last,result,a = 1,'','',str(a)
for i in range(len(a)):
if last==a[i]:k+=1
else:
result = result+str(k)+a[i]
k=1
last = a[i]
return result
我发现你的代码有两个问题:
虽然计数器
k
不计算字符a[i]
,但result
被k
和a[i]
扩展。将a[i]
替换为last
(您可能不想在第一轮中添加任何内容)。循环之后,您必须再次将计数器的最后一个值与最后一个字符相加(这尚未完成),即在循环之后再添加一个
result = result+str(k)+last
。总的来说
我想你为什么会被难住的部分原因是你使用了无意义的变量名。您很好地描述了这个问题并用名称来调用它,但是您的函数甚至没有使用这个名称。
如果你认为你以“看”开头的字符串,而以“说”结尾的字符串,那就是一个开始。
result
可能很好,但是a
和k
让你困惑。last
我认为是误导性的,因为它可以表示前一个或最后一个。另外,Python的
for
实际上是foreach
,这是有原因的——在“look”中每个字符一个接一个,所以在循环中显式地执行它。间距不那么重要,但Python确实有一个standard coding style,而且它确实有助于使用它的可读性。你花在分析代码上的时间越少,你对问题的关注就越多。
你可以使用
groupby
,这正是你想要的:groupby
从iterable对象返回连续的键和组。键是为每个元素计算的函数,如果未指定,则为标识函数(如上所述)。这个组是一个迭代器-当键函数的值改变时会生成一个新的组。例如,根据文献记载:相关问题 更多 >
编程相关推荐