我的理解,函数f需要2个参数x和y,但A只有一个元素,无法满足要求,所以直接返回A了
那你用reduce函数的时候是怎么想的呀,因为‘A1’和上面那个情况是一样的 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 冬雪雪冬 发表于 2017-5-20 22:08
以我的程序为例:
哦~也就是说如果只有一个元素的reduce函数直接就返回那个元素了是吧 badaoqingchen 发表于 2017-5-20 22:17
哦~也就是说如果只有一个元素的reduce函数直接就返回那个元素了是吧
应该是 啊啊 冬雪雪冬 发表于 2017-5-20 22:29
应该是
好的 谢谢啦 因为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-19 16:09
重新写了。
RC13,这样的时候你这个返回是错误的 余欲渔 发表于 2017-5-22 13:40
RC13,这样的时候你这个返回是错误的
跟你的结果一样呀 关键是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 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) 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))) {:9_218:}
哈哈哈,重新修改一波,强行续命
本帖最后由 萧丹夜 于 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 学习中 赞 kanakn 学习 1 '''
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'))