鱼C论坛

 找回密码
 立即注册
楼主: ooxx7788

[技术交流] Python:每日一题 49

[复制链接]
发表于 2017-5-20 22:02:08 | 显示全部楼层
冬雪雪冬 发表于 2017-5-20 21:55
我的理解,函数f需要2个参数x和y,但A只有一个元素,无法满足要求,所以直接返回A[0]了

那你用reduce函数的时候是怎么想的呀,因为‘A1’和上面那个情况是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-20 22:08:49 | 显示全部楼层
badaoqingchen 发表于 2017-5-20 22:02
那你用reduce函数的时候是怎么想的呀,因为‘A1’和上面那个情况是一样的

以我的程序为例:
def spreadsheet(s):
    import re, functools
    if re.search(r'\dC', s):
        r, c = s.split('C')
        c = int(c)
        column = ''
        while c:
            c -= 1
            column = chr(c % 26 + 65) + column
            c //= 26
        return column + r[1:]
    else:
        c = re.search(r'\D+', s).group()
        r = re.search(r'\d+', s).group()
        c_lst =[ord(i) - 64 for i in c]
        c = functools.reduce(lambda x, y: x * 26 + y, c_lst)
        return 'R' + r + 'C' +  str(c)

如果c只有一个字母,如"A",则c_lst为[1]
reduce后,c=1
如果c有2个字母"AA", 则c-lst为[1, 1]
reduce后,c= 26*1 +1=27
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-20 22:17:19 | 显示全部楼层

哦~也就是说如果只有一个元素的  reduce函数直接就返回那个元素了是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-20 22:29:19 | 显示全部楼层
badaoqingchen 发表于 2017-5-20 22:17
哦~也就是说如果只有一个元素的  reduce函数直接就返回那个元素了是吧

应该是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-21 09:19:46 | 显示全部楼层
啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-5-21 12:19:59 | 显示全部楼层

好的 谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-22 13:37:17 | 显示全部楼层
因为Excel表最多就两个字母,就写简单点了
def spreadsheet(sr='A1'):
    R=0
    C=0
    if sr[0]=='R' and 'C'in sr:
        b=sr[1:].split('C')
        if b[0].isdigit() and b[1].isdigit():
            R=b[0]
            C=int(b[1])
            if C<=26:return chr(C+64)+R
            return chr(C//26+64)+chr(C%26+64)+R
    lsr=len(sr)
    for i in range(lsr):
        if sr[i] in '0123456789':
            zm=sr[:i]
            sz=sr[i:]
            break
    if len(zm)==1:return 'R'+sz+'C'+str(ord(zm[0])-64)
    return 'R'+sz+'C'+str((ord(zm[0])-64)*26+ord(zm[1])-64)
print(spreadsheet('M15'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-22 13:40:20 | 显示全部楼层

RC13,这样的时候你这个返回是错误的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-22 14:15:23 | 显示全部楼层
余欲渔 发表于 2017-5-22 13:40
RC13,这样的时候你这个返回是错误的

跟你的结果一样呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-7 21:06:15 | 显示全部楼层
关键是26进制中A代表0,Z代表25
# 行的信息只要加减"R"和移动位置;列的信息估计要26进制转换
def spreadsheet(s):
    num_1,num_2 = s.find('R'),s.find('C')
    if num_1 !=-1 and num_2 and s[num_1 +1:num_2].isdigit(): # 字母中间夹数字是RC显示
        row = s[num_1 +1:num_2]
        col = int(s[num_2 +1:])
        output = ""
        while col:
            output = str(chr((col-1)%26 + 65))+output # 26进制后按Unicode换成字母
            col = (col-1)//26  # 字母开头A=0,Z=25
        return output+row
    else:
        row = "".join([i for i in s if i.isdigit()]) 
        num = [ord(i)-64 for i in s.replace(row,"")[::-1]]
        col = str(sum([i*26**j for i,j in zip(num,range(len(num)))])) # 按权重算列数
        return "R"+row+"C"+col
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-28 15:10:16 | 显示全部楼层
def spreadsheet(x):
        import re,functools
        if re.search(r'\dC',x):
                r,c = re.search(r'(\d+)C(\d+)',x).groups()
                str1 = ''
                c = int(c)
                while c:
                        if c%26 == 0:
                                str1 = chr(26+64) +str1
                                c = c//26 - 1
                        else:
                                str1 = chr(c%26+64) + str1
                                c = c//26
                return str1+r
        else:
                d = re.search(r'\d+',x).group()
                s = re.search(r'\D+',x).group()
                LS = [ord(i)-64 for i in s]
                ssum = functools.reduce(lambda x,y:x*26+y,LS)
                return 'R'+d+'C'+str(ssum)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 22:07:03 | 显示全部楼层
def SpreadSheetExchange(st):
    lis1 = [i for i in range(1, 27)]
    lis2 = [j for j in range(65, 91)]
    lis3 = [chr(i) for i in lis2]
    dic1 = dict(zip(lis1, lis3))
    dic2 = dict(zip(lis3, lis1))
    if st.count('R') == 1 and st.count('C') == 1 and st[1] != 'C':
        t = st.partition('C')
        Column = int(t[2])
        st = t[0]
        t = st.partition('R')
        Row = int(t[2])
        lis = []
        while Column != 0:
                  lis.insert(0, Column % 26)
                  Column //= 26
        st = ''
        for i in lis:
            st += dic1[i] 
        return st + str(Row)
    else:
        Column = []
        Column_num = []
        Row = []
        for i in range(len(st)):
            if ord(st[i]) >= 65:
                Column.append(st[i])
            else:
                Row.append(st[i])
        for i in Column:
            Column_num.append(dic2[i])
        Column_num.reverse()
        Sum = 0
        for i in range(len(Column_num)):
            Sum += Column_num[i] * 26 ** i
        st = ''
        for i in Row:
            st += i
        return 'R' + st + 'C' + str(Sum)
st = ['A1', 'R1C1', 'D5', 'R5C4', 'AA48', 'R48C27', 'BK12', 'R12C63']
for i in st:
    print('%-19s%-19s' % (i, SpreadSheetExchange(i)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-28 16:28:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-3 20:53:55 | 显示全部楼层

哈哈哈,重新修改一波,强行续命

本帖最后由 萧丹夜 于 2018-7-3 21:57 编辑

第一眼太简单了,然而还是花了很多时间,不过也学到了
import test
import re

def spreadsheet(s):
    # 分割(区分)
    pattern = re.compile(r'([A-Z]+)([0-9]+)')
    x = pattern.findall(s)
    # 转换
    result = ''
    if len(x) == 1:
        k = 0
        i = 0
        for each in x[0][0][::-1]:
            i += (ord(each)-64) * (26 ** k)
            k += 1
        result = 'R' + x[0][1] + 'C' + str(i)
        return result
    if len(x) == 2:
        n = 0
        k = int(x[1][1])
        while(26 ** n <= k):          # x[1][1]为列数 十进制转26进制(字母)
            n += 1
        for i in range(n-1,-1,-1):
            y = k // (26 ** i)
            k -= y * (26 ** i)
            result += chr(y + 64)
        if result.find('@') != -1:
            index = result.find('@')
            # result[index] = 'Z'
            # result[index-1] = chr(ord(result[index-1])-1)
            result = result[:index-1] + chr(ord(result[index-1])-1) + 'Z' + result[index+1:]
        if result[0] == '@':
            result = result[1:]
        return result + x[0][1]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-22 14:22:46 | 显示全部楼层
学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 10:26:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-9 16:21:19 | 显示全部楼层
kanakn
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-28 23:15:15 From FishC Mobile | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-24 10:24:22 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-1 14:44:28 | 显示全部楼层
'''
https://docs.python.org/zh-cn/3.7/library/string.html?highlight=string#module-string
string.ascii_letters
下文所述 ascii_lowercase 和 ascii_uppercase 常量的拼连。 该值不依赖于语言区域。
string.ascii_lowercase
小写字母 'abcdefghijklmnopqrstuvwxyz'。 该值不依赖于语言区域,不会发生改变。
string.ascii_uppercase
大写字母 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。 该值不依赖于语言区域,不会发生改变。
string.digits
字符串 '0123456789'。
string.hexdigits
字符串 '0123456789abcdefABCDEF'。
string.octdigits
字符串 '01234567'。
string.punctuation
由在 C 语言区域中被视为标点符号的 ASCII 字符组成的字符串。
string.printable
由被视为可打印符号的 ASCII 字符组成的字符串。 这是 digits, ascii_letters, punctuation 和 whitespace 的总和。
string.whitespace
由被视为空白符号的 ASCII 字符组成的字符串。 其中包括空格、制表、换行、回车、进纸和纵向制表符。
'''
#给出26进制的对应关系
import string
#生成26位大写字母
temp = string.ascii_uppercase
dict1 = {}
count =1
count1 = 0
dict2 = {}
#按照大写字母的递增顺序给出大写字母和数字的对应关系并存放在字典中dict1中 dict1 = {'A': 1, 'B': 2......'Y': 25, 'Z': 26}
for i in temp:
    dict1[i] = count
    count +=1
#按照数字的递增和大写字母的递增顺序的对应关系来存放在字典dict2中
for i in range(1,27):
    dict2[i] = temp[count1]
    count1 +=1

#求各个进制下面给定一个数,然后求这个数的各个数字
def getnum(num,bin):
    list1 = []
    length = len(str(num))
    while length>0:
        #通过数值对26求余数,得到最低位的数字并保存
        i = num %bin
        #num = num对26取整除,将num的值更新为除以26之后的商
        num = num //bin
        list1.append(i)
        #length控制循环次数
        length -= 1
    #由于列表中的值时从低位到高数,因为取反后,得到从高位到低位的各个数字列表
    list2 = list(reversed(list1))
    return list2

def spreadsheet(sheet):
    if (sheet.find('R') != -1 ) and (sheet.find('C') != -1 ) and (sheet.find('C')-sheet.find('R')>=2):
        sheet_num1 = ''.join(sheet.split('R'))
        sheet_num2 = sheet_num1.split('C')
        #得到行的值
        num_r= sheet_num2[0]
        #得到列的值
        num_c = sheet_num2[1]
        #根据列的值来计算对应的字母
        lst = getnum(int(num_c),26)
        result_str = ''.join(dict2[i] for i in lst)
        result = result_str+str(num_r)
        return result

    else:
        #得到字母
        sheet_alpha = ''.join(j for j in sheet if j.isalpha())
        length = len(sheet_alpha)
        sum =0
        count = 0
        #根据字母来计算对应的行也就是C
        for i in range(length-1,-1,-1):
            sum += dict1[sheet_alpha[count]]*(26**i)
            count+=1
        #得到对应的列也就是
        sheet_num = ''.join(k for k in sheet if k.isdigit())
        result = 'R'+sheet_num+'C'+str(sum)
        return result

print(spreadsheet('R12C63'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表