Python 接收str并给出每个字符在一行中出现的次数
我需要编写一个函数来接收str,并给出序列中每个字符在一行中出现的次数。字符串在列表中表示 列表中的每个元素也是一个列表,包含2个元素: 一个字符及其重复次数。 例如:Python 接收str并给出每个字符在一行中出现的次数,python,Python,我需要编写一个函数来接收str,并给出序列中每个字符在一行中出现的次数。字符串在列表中表示 列表中的每个元素也是一个列表,包含2个元素: 一个字符及其重复次数。 例如: input: 'aaabbcb' output: [[a,3],[b,2][c,1][b,1]] 代码需要是一个简单的函数,因为我是python的新手 def str2rle (n): n=[n] counter=1 for char in n: if len(n)==1: return [char,1
input: 'aaabbcb'
output: [[a,3],[b,2][c,1][b,1]]
代码需要是一个简单的函数,因为我是python的新手
def str2rle (n):
n=[n]
counter=1
for char in n:
if len(n)==1:
return [char,1]
else:
if char[0]==char[1]:# I know this row isn't right but I cant think of the right row to #write
counter+=1
return [char,counter]
return [char,1]
您可以在此处使用列表列表:
def str2rle(text):
ans = []
prev = None #initialize `prev` to None
#iterate over the string
for c in text:
# if current character is not equal to the previous character
# then append a new list
if c != prev:
ans.append([c, 1]) #insert new list at the end
prev = c #set `prev` to current character
else:
# if current character is equal to the prev then simply increment
# the second item of the last list
ans[-1][1] += 1 #ans[-1] return the last list from `ans`
return ans
演示:
>>> str2rle('aaabbcb')
[['a', 3], ['b', 2], ['c', 1], ['b', 1]]
>>> str2rle('foobar')
[['f', 1], ['o', 2], ['b', 1], ['a', 1], ['r', 1]]
pythonic和有效的方法是使用itertools.groupby
:
>>> from itertools import groupby
>>> [[k, sum(1 for _ in g)] for k, g in groupby('aaabbcd')]
[['a', 3], ['b', 2], ['c', 1], ['d', 1]]
递归解
s = 'aaabbcb'
def sc(s,t=s[0],c=0, ans=[]):
if len(s)>0:
if s[0] == t:
return sc(s[1:],s[0],c+1, ans)
else:
return sc(s[1:],s[0],1, ans +[[t,c]])
else:
return ans + [[t,c]]
print sc(s)
[['a', 3], ['b', 2], ['c', 1], ['b', 1]]
编辑:不可变的默认参数
s = 'aaabbcb'
def sc(s,ans,t,c):
if len(s)>0:
if s[0] == t:
return sc(s[1:], ans ,s[0],c+1)
else:
return sc(s[1:],ans +[[t,c]],s[0],1)
else:
return ans + [[t,c]]
print sc(s,[],s[0],0)
编辑:我想我是怎么说的
def str2l(s):
def sc(s,t,ans,c = 0):
if len(s)>0:
if s[0] == t:
return sc(s[1:],s[0], ans,c+1)
else:
return sc(s[1:],s[0], ans +[[t,c]],1)
else:
return ans + [[t,c]]
return sc(s,s[0],[])
print str2l('aaabbcb')
因此,请检查代码中的注释以查看答案
import unittest
from itertools import cycle
def count_n_times_letter_appears(word):
lst_times = []
lst_cycle = cycle(word)
# get first item
next_item = lst_cycle.next()
count_times = 1
idx = 0
# append the first letter to the list
lst_times.append([word[0], count_times])
for letter in word[:-1]:
# counter for each time a repeated letter appears in a row
current_item, next_item = next_item, lst_cycle.next()
# if it is the same item as before, increment
if current_item == next_item:
count_times += 1
lst_times[idx] = [current_item, count_times]
# create a new index to append a new letter/counter
else:
count_times = 1
lst_times.append([next_item, count_times])
idx += 1
return lst_times
class TestRepeatingLetters(unittest.TestCase):
def test_count_times_appears_your_example(self):
self.assertEqual([['a', 3], ['b', 2], ['c', 1], ['b', 1]], count_n_times_letter_appears("aaabbcb"))
def test_count_common_word(self):
self.assertEqual([['g', 1], ['o', 2], ['d', 1]], count_n_times_letter_appears("good"))
def test_count_no_repeated_letters(self):
self.assertEqual([['a', 1], ['b', 1], ['c', 1]], count_n_times_letter_appears("abc"))
if __name__ == "__main__":
unittest.main()
这可能会有帮助:如何添加代码,使其像python中那样组织?这可以通过使用itertools.groupby
[[k,sum(1代表u.in v)]为itertools.groupby中的k,v('aaabbcb')]
轻松实现。要使用itertools,您需要在使用之前导入模块import-itertools
。我还没有学习“在字符串中计算运行次数”中的代码,并且groupby@user2751595当你说“我还没学会……”时,这是不是意味着这是做作业用的?因为否则我会说,看看刚才教你的网站:)@AshwiniChaudhary是第二个更好的网站,因为它只是从空列表中通过?我听说过不可变默认参数的问题,但还没有真正感受到从中学习的痛苦,哈哈。问题是可变参数而不是不可变参数。(使用不同的输入调用第一个代码两次,看看会发生什么)顺便说一句,最好添加这样的函数体:defsc(…ans=None):ans=[]如果ans不是其他ans
,因为如果您计划将来将ans
更改为{}
,则只需在一个位置(函数体内部)更改它。@AshwiniChaudhary我听到了。我想我只是想通过改变变量s来修改这个程序,我想我应该把它全部封装在另一个函数中。尽管如此,可变参数仍然存在,但是我可以声明变量。我经常在我觉得有趣的事情和最佳实践之间进行斗争。谢谢你的意见。