badaoqingchen 发表于 2017-5-20 22:02:08

冬雪雪冬 发表于 2017-5-20 21:55
我的理解,函数f需要2个参数x和y,但A只有一个元素,无法满足要求,所以直接返回A了

那你用reduce函数的时候是怎么想的呀,因为‘A1’和上面那个情况是一样的

冬雪雪冬 发表于 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
    else:
      c = re.search(r'\D+', s).group()
      r = re.search(r'\d+', s).group()
      c_lst =
      c = functools.reduce(lambda x, y: x * 26 + y, c_lst)
      return 'R' + r + 'C' +str(c)

如果c只有一个字母,如"A",则c_lst为
reduce后,c=1
如果c有2个字母"AA", 则c-lst为
reduce后,c= 26*1 +1=27

badaoqingchen 发表于 2017-5-20 22:17:19

冬雪雪冬 发表于 2017-5-20 22:08
以我的程序为例:




哦~也就是说如果只有一个元素的reduce函数直接就返回那个元素了是吧

冬雪雪冬 发表于 2017-5-20 22:29:19

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

应该是

sue~sr 发表于 2017-5-21 09:19:46

啊啊

badaoqingchen 发表于 2017-5-21 12:19:59

冬雪雪冬 发表于 2017-5-20 22:29
应该是

好的 谢谢啦

余欲渔 发表于 2017-5-22 13:37:17

因为Excel表最多就两个字母,就写简单点了
def spreadsheet(sr='A1'):
    R=0
    C=0
    if sr=='R' and 'C'in sr:
      b=sr.split('C')
      if b.isdigit() and b.isdigit():
            R=b
            C=int(b)
            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 in '0123456789':
            zm=sr[:i]
            sz=sr
            break
    if len(zm)==1:return 'R'+sz+'C'+str(ord(zm)-64)
    return 'R'+sz+'C'+str((ord(zm)-64)*26+ord(zm)-64)
print(spreadsheet('M15'))

余欲渔 发表于 2017-5-22 13:40:20

冬雪雪冬 发表于 2017-5-19 16:09
重新写了。

RC13,这样的时候你这个返回是错误的

冬雪雪冬 发表于 2017-5-22 14:15:23

余欲渔 发表于 2017-5-22 13:40
RC13,这样的时候你这个返回是错误的

跟你的结果一样呀

solomonxian 发表于 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.isdigit(): # 字母中间夹数字是RC显示
      row = s
      col = int(s)
      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()
      num = ]
      col = str(sum()) # 按权重算列数
      return "R"+row+"C"+col

张大象 发表于 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 =
                ssum = functools.reduce(lambda x,y:x*26+y,LS)
                return 'R'+d+'C'+str(ssum)

victor.xu 发表于 2018-3-27 22:07:03

def SpreadSheetExchange(st):
    lis1 =
    lis2 =
    lis3 =
    dic1 = dict(zip(lis1, lis3))
    dic2 = dict(zip(lis3, lis1))
    if st.count('R') == 1 and st.count('C') == 1 and st != 'C':
      t = st.partition('C')
      Column = int(t)
      st = t
      t = st.partition('R')
      Row = int(t)
      lis = []
      while Column != 0:
                  lis.insert(0, Column % 26)
                  Column //= 26
      st = ''
      for i in lis:
            st += dic1
      return st + str(Row)
    else:
      Column = []
      Column_num = []
      Row = []
      for i in range(len(st)):
            if ord(st) >= 65:
                Column.append(st)
            else:
                Row.append(st)
      for i in Column:
            Column_num.append(dic2)
      Column_num.reverse()
      Sum = 0
      for i in range(len(Column_num)):
            Sum += Column_num * 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)))

牧之 发表于 2018-3-28 16:28:35

{:9_218:}

萧丹夜 发表于 2018-7-3 20:53:55

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

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

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

def spreadsheet(s):
    # 分割(区分)
    pattern = re.compile(r'(+)(+)')
    x = pattern.findall(s)
    # 转换
    result = ''
    if len(x) == 1:
      k = 0
      i = 0
      for each in x[::-1]:
            i += (ord(each)-64) * (26 ** k)
            k += 1
      result = 'R' + x + 'C' + str(i)
      return result
    if len(x) == 2:
      n = 0
      k = int(x)
      while(26 ** n <= k):          # x为列数 十进制转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 = 'Z'
            # result = chr(ord(result)-1)
            result = result[:index-1] + chr(ord(result)-1) + 'Z' + result
      if result == '@':
            result = result
      return result + x

小强工作室 发表于 2018-7-22 14:22:46

学习中

我不会啊 发表于 2018-9-6 10:26:52

咕咕鸡鸽鸽 发表于 2019-1-9 16:21:19

kanakn

holiday_python 发表于 2020-4-28 23:15:15

学习

19971023 发表于 2020-7-24 10:24:22

1

nononoyes 发表于 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 = count
    count +=1
#按照数字的递增和大写字母的递增顺序的对应关系来存放在字典dict2中
for i in range(1,27):
    dict2 = temp
    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
      #得到列的值
      num_c = sheet_num2
      #根据列的值来计算对应的字母
      lst = getnum(int(num_c),26)
      result_str = ''.join(dict2 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]*(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'))
页: 1 [2] 3
查看完整版本: Python:每日一题 49