Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 接收str并给出每个字符在一行中出现的次数_Python - Fatal编程技术网

Python 接收str并给出每个字符在一行中出现的次数

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

我需要编写一个函数来接收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]
    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来修改这个程序,我想我应该把它全部封装在另一个函数中。尽管如此,可变参数仍然存在,但是我可以声明变量。我经常在我觉得有趣的事情和最佳实践之间进行斗争。谢谢你的意见。