我正在尝试编写一个简单的python算法来解决这个问题。你能帮我弄清楚为什么我的代码不能正常工作:
问题:
如果任何字符重复超过4次,则整套 重复的字符应替换为斜杠'/',后跟a 2位数字,这是重复字符的长度, 和角色。例如,“aaaaa”将被编码为“/ 05a”。 执行后不应更换4个或更少字符的运行 编码不会减少字符串的长度。
我的代码:
def runLengthEncode (plainText):
res=''
a=''
for i in plainText:
if a.count(i)>0:
a+=i
else:
if len(a)>4:
res+="/" + str(len(a)) + a[0][:1]
else:
res+=a
a=i
return(res)
答案 0 :(得分:5)
除了在编码序列后设置a=i
并在打印到字符串时设置int的宽度。您还可以执行以下利用蟒蛇groupby
的方法。在构造字符串时使用format
也是一个好主意。
from itertools import groupby
def runLengthEncode (plainText):
res = []
for k,i in groupby(plainText):
run = list(i)
if(len(run) > 4):
res.append("/{:02}{}".format(len(run), k))
else:
res.extend(run)
return "".join(res)
答案 1 :(得分:2)
观察行为:
>>> runLengthEncode("abcd")
'abc'
忽略最后一个字符。你必须追加你收集的东西。
>>> runLengthEncode("abbbbbcd")
'a/5b/5b'
糟糕,编码后出现问题。即使您找到足够长的序列,也应设置a=i
。
答案 2 :(得分:2)
Rosetta代码a lot of implementations,应该很容易适应您的用例。
这是带有正则表达式的Python代码:
from re import sub
def encode(text):
'''
Doctest:
>>> encode('WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW')
'12W1B12W3B24W1B14W'
'''
return sub(r'(.)\1*', lambda m: str(len(m.group(0))) + m.group(1),
text)
def decode(text):
'''
Doctest:
>>> decode('12W1B12W3B24W1B14W')
'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW'
'''
return sub(r'(\d+)(\D)', lambda m: m.group(2) * int(m.group(1)),
text)
textin = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
assert decode(encode(textin)) == textin
答案 3 :(得分:1)
您可以将groupby()功能与列表/生成器理解结合使用:
from itertools import groupby, imap
''.join(x if reps <= 4 else "/%02d%s" % (reps, x) for x, reps in imap(lambda x: (x[0], len(list(x[1]))), groupby(s)))
答案 4 :(得分:0)
我知道这不是最有效的解决方案,但我们还没有像groupby()
那样研究函数,所以这就是我所做的:
def runLengthEncode (plainText):
res=''
a=''
count = 0
for i in plainText:
count+=1
if a.count(i)>0:
a+=i
else:
if len(a)>4:
if len(a)<10:
res+="/0"+str(len(a))+a[0][:1]
else:
res+="/" + str(len(a)) + a[0][:1]
a=i
else:
res+=a
a=i
if count == len(plainText):
if len(a)>4:
if len(a)<10:
res+="/0"+str(len(a))+a[0][:1]
else:
res+="/" + str(len(a)) + a[0][:1]
else:
res+=a
return(res)
答案 5 :(得分:0)
我可以想到的一种简单的游程编码解决方案:
用于编码类似"a4b5c6d7..."
的字符串:
def encode(s):
counts = {}
for c in s:
if counts.get(c) is None:
counts[c] = s.count(c)
return "".join(k+str(v) for k,v in counts.items())
用于解码"aaaaaabbbdddddccccc...."
之类的字符串:
def decode(s):
return "".join((map(lambda tup: tup[0] * int(tup[1]), zip(s[0:len(s):2], s[1:len(s):2]))))
完全易于阅读和简单。
答案 6 :(得分:0)
this my html
<ion-list>
<ion-item >
<ion-label stacked>Skill Set (separate with comma)</ion-label>
<ion-input type="text" [(ngModel)]="skills" name="skills" placeholder="eg. PHP, Writing, Chef" required="required"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>Email</ion-label>
<ion-input type="email" [(ngModel)]="email" name="email" placeholder="eg. john@doe.com"></ion-input>
</ion-item>
<ion-item >
<ion-label stacked>Phone</ion-label>
<ion-input type="text" [(ngModel)]="phone" name="phone" placeholder="eg. 0802222222" required="required"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>Password</ion-label>
<ion-input type="password" [(ngModel)]="password" name="password"></ion-input>
</ion-item>
<hr/>
<ion-item>
<ion-label stacked>First name</ion-label>
<ion-input type="text" [(ngModel)]="first_name" name="first_name"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>Last name</ion-label>
<ion-input type="text" [(ngModel)]="last_name" name="last_name"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>City</ion-label>
<ion-input type="text" [(ngModel)]="city" name="city"></ion-input>
</ion-item>
<ion-item>
<ion-label stacked>State/Province</ion-label>
<ion-input type="text" [(ngModel)]="state" name="state"></ion-input>
</ion-item>
<ion-item>
<ion-label>Looking for Job?</ion-label>
<ion-toggle [(ngModel)]="isJobSeeker" name="phone" checked="false"></ion-toggle>
</ion-item>
<div padding text-center>
<button ion-button color="danger" round (click)="doSignup()" >Signup</button>
</div>
</ion-list>
答案 7 :(得分:0)
Split=(list(input("Enter string: ")))
Split.append("")
a = 0
for i in range(len(Split)):
try:
if (Split[i] in Split) >0:
a = a + 1
if Split[i] != Split[i+1]:
print(Split[i],a)
a = 0
except IndexError:
print()
这更容易,并且每次都能工作
答案 8 :(得分:0)
def RLE_comp_encode(text):
if text == text[0]*len(text) :
return str(len(text))+text[0]
else:
comp_text , r = '' , 1
for i in range (1,len(text)):
if text[i]==text[i-1]:
r +=1
if i == len(text)-1:
comp_text += str(r)+text[i]
else :
comp_text += str(r)+text[i-1]
r = 1
return comp_text
这对我有用,
答案 9 :(得分:0)
我在这里看到了很多很棒的解决方案,但是没有一个对我而言感觉很Python。因此,我正在为我今天为解决这个问题写的一个实现做贡献。
def run_length_encode(data: str) -> Iterator[Tuple[str, int]]:
"""Returns run length encoded Tuples for string"""
# A memory efficient (lazy) and pythonic solution using generators
return ((x, sum(1 for _ in y)) for x, y in groupby(data))
这将返回具有元组的字符和实例数的元组生成器,但也可以很容易地对其进行修改以返回字符串。这样做的好处是,它们都是惰性计算的,并且如果您不需要耗尽整个搜索空间,则不会消耗更多的内存或cpu。
如果您仍然希望对字符串进行编码,则可以针对这种用例轻松修改代码,如下所示:
def run_length_encode(data: str) -> str:
"""Returns run length encoded string for data"""
# A memory efficient (lazy) and pythonic solution using generators
return "".join(f"{x}{sum(1 for _ in y)}" for x, y in groupby(data))
这对所有长度(而不只是对超过4个字符的长度)都进行了更通用的游程长度编码,但是如果需要,也可以很容易地为字符串加上条件。