鍍金池/ 問答/Python/ python多則運(yùn)算的問題

python多則運(yùn)算的問題

現(xiàn)在有一個(gè)列表,長(zhǎng)度不固定,

[2, 100, 3, 10, 4] 長(zhǎng)度為 5 的列表

則有 長(zhǎng)度減一 的操作符,規(guī)則如下:

  1. 如果列表長(zhǎng)度為 1,則直接輸出結(jié)果,如列表為 [4], 輸出為 4
  2. 如果為空列表 [], 輸出結(jié)果為 0
  3. 如果第一個(gè)數(shù)小于第二地?cái)?shù)則為 乘法,反之為 加法

 * 列表 [10, 2], 輸出結(jié)果為 10 + 2 = 12
 * 列表 [2, 10], 輸出結(jié)果為 2 * 10 = 20

最后效果如下:

2 * 100 + 3 * 10 + 4 = 234

求該表達(dá)式的和, 如何用 python 代碼實(shí)現(xiàn)

ps:
當(dāng)?shù)谝粋€(gè)比較數(shù)為 0 時(shí),則和后面的數(shù)相加

[2, 100, 0, 5]

預(yù)期結(jié)果是:

2 * 100 + 0 + 5 = 205

我想做的一個(gè)函數(shù)就是把中文數(shù)字變?yōu)樾憯?shù)字,如:

圖片描述

錯(cuò)誤結(jié)果:

圖片描述

回答
編輯回答
浪蕩不羈
def foo(s):
    if not s:
        return 0
    length = len(s)
    if length == 1:
        return s[0]
    exp = '(' + str(s[0]) + ')'
    for i in range(1, length):
        if s[i-1] < s[i] and s[i-1] != 0:
            op = '*'
        else:
            op = '+'
        exp = exp + op + '(' + str(s[i]) + ')'
    print(eval(exp))
>>> foo([4])
4
>>> foo([])
0
>>> foo([10, 2])
12
>>> foo([2, 10])
20
>>> foo([2, 100, 3, 10, 4])
234
>>> foo([2, 100, 0, 5])
205
>>> foo([-3, -10, -1])
7

中文數(shù)字轉(zhuǎn)阿拉伯?dāng)?shù)字(遞歸版本)

d = { '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9}

def _trans(s):
    num = 0
    if s:
        idx_q, idx_b, idx_s = s.find('千'), s.find('百'), s.find('十')
        if idx_q != -1:
            num += d[s[idx_q-1:idx_q]] * 1000
        if idx_b != -1:
            num += d[s[idx_b-1:idx_b]] * 100
        if idx_s != -1:
            # 一十的一可被省略
            num += d.get(s[idx_s-1:idx_s], 1) * 10
        if s[-1] in d:
            num += d[s[-1]]
    return num
def trans(chn):
    chn = chn.replace('零', '')
    idx_y = chn.rfind('億')
    idx_w = chn.rfind('萬')
    if idx_y > idx_w:
        idx_w = -1     
    num_y = 100000000
    num_w = 10000
    if idx_y != -1 and idx_w != -1:
        return trans(chn[:idx_y])*num_y + _trans(chn[idx_y+1:idx_w])*num_w + _trans(chn[idx_w+1:])
    elif idx_y != -1:
        return trans(chn[:idx_y])*num_y + _trans(chn[idx_y+1:])
    elif idx_w != -1:
        return _trans(chn[:idx_w])*num_w + _trans(chn[idx_w+1:])
    return _trans(chn)
print(1,trans('一萬億二千一百萬零一百零一')) # 1000021000101
print(2,trans('一萬億零二千一百零一')) # 1000000002101
print(3,trans('二千一百零一')) # 2101
print(4,trans('三十五萬六千一百')) # 356100
print(5,trans('二億三十萬六千一百')) # 200306100
print(6,trans('二億億三十萬六千一百')) # 20000000000306100
print(7,trans('十')) # 10
print(8,trans('三百零五')) # 305
print(9,trans('一億零二百三十萬億四千零五十六萬七千八百九十')) # 10230000040567890
2018年4月27日 11:40
編輯回答
淺時(shí)光
def sum(l):
    res, t = 0, 1
    for i in range(1, len(l)):
        t *= l[i - 1]
        if l[i - 1] >= l[i] or l[i - 1] is 0:
            res, t = res + t, 1
    return (res + t * l[-1]) if l else 0
  
d = {'': 0, '百': 100, '零': 0, '一': 1, '萬': 10000, '五': 5, '三': 3, '六': 6, '九': 9, '四': 4, '十': 10, '七': 7, '千': 1000, '二': 2, '億': 100000000, '八': 8}

sum([d[i] for i in '二億三十萬六千一百'])
sum([d[i] for i in '三十五萬六千一百']) # [3, 10, 5, 10000, 6, 1000, 1, 100] 56130不正確

def change(s):
    res = 0
    for j in '億萬千百':
        if j in s:
            l = s.split(j)
            for i in l:
                res =  res * d[j] + change(i)
            return res
    if '十' in s:
        l = s.split('十')
        if not l[0]:
            return 10 + d[l[1]]
        else:
            return 10 * change(l[0]) + d[l[1]]
    return d[s[1]] if '零' in s else d[s]
    
change('三十五萬六千一百') 356100
change('二億三十萬六千一百') 200306100
change('二億億三十萬六千一百') 20000000000306100
change('十一') 11
change('三百零五') 305
change('一億零二百三十萬億四千零五十六萬七千八百零九十') 10230000040567890
2017年2月9日 07:03