将括号中的数字相邻地组合起来

2024-04-27 22:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想写一个函数来组合括号中相邻的数字。 例如,这个字符串作为输入

(4)2(2)(2)(2)2(2)

我希望输出是

(4)2(6)2(2)

例如,这个字符串作为输入

(2)(2)2(2)(2)(2)24

我希望输出是

(4)2(6)24

目前我写了一个函数如下:

def Combine(i,accumulate,s):
    if s[i] == '(':
        accumulate += int(s[i+1])
        for i in range(i+3,len(s),3):
            if s[i] == '(':
                accumulate += int(s[i+1])
            else:
                print s[i-3] + s[i-2] + s[i-1]
                i += 3
                break
    else:
        print s[i]
        i += 1


Combine(0,0,'(4)2(2)(2)(2)2(2)')

输出仅为:

(4)

我知道也许我需要递归方法,但我不知道如何正确使用它。 有人能帮我吗?你知道吗

我把它当作一位数的问题,求和之后,我需要把大于9的数字转换成相应的字母表。你知道吗

功能如下:

def toStr(n,base):
convertString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
if n < base:
  return convertString[n]
else:
  return toStr(n//base,base) + convertString[n%base]

例如,输入(基数为17):

(16)

输出需要:

(G)

因为我不知道如何修改函数

re.sub(r'((\(\d\))+)', f, '(2)(2)(2)(2)(2)(2)(2)(2)')

谢谢。你知道吗


Tags: 函数字符串basereturnifdef数字else
1条回答
网友
1楼 · 发布于 2024-04-27 22:57:41

我会用正则表达式:

import re

def f(m):
    return '({0})'.format(sum(int(x) for x in m.group(1)[1::3]))

re.sub(r'((\(\d\))+)', f, '(4)2(2)(2)(2)2(2)') # (4)2(6)2(2)

^{}的第二个参数可以是一个函数,可以用来计算和:

If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string.

m.group(1)是匹配的字符串,m.group(1)[1::3]是不带括号的匹配字符串。你知道吗

sum(int(x) for x in m.group(1)[1::3])获取字符串中所有数字的总和。你知道吗

'({0})'.format(sum(int(x) for x in m.group(1)[1::3]))用括号包装总和(这是替换字符串)。你知道吗


请注意,上面的代码只适用于一位数。如果这是一个问题,你会使用

import re

def f(m):
    matched = m.group(1).strip('()').split(')(')
    return '({0})'.format(sum(int(x) for x in matched))

re.sub(r'((\(\d+\))+)', f, '(42)(2)2') # (44)2

相关问题 更多 >