Python:每日一题 49

2017-11-27 13:36:00
六月
来源:
http://bbs.fishc.com/thread-87429-1-1.html
转贴 584
转换电子表格的行列显示。

  1. Spreadsheet        Row Column
  2. A1                 R1C1
  3. D5                 R5C4
  4. AA48               R48C27
  5. BK12               R12C63
复制代码


A1单元格,表示的是第一行R1,第一列C1
D5单元格,表示的是第五行R5,第四列C1

好了,现在请你给出一个函数def spreadsheet(s):,可以实现两者之间的 相互转换。

测试代码忘记给了!
  1. test.assert_equals(spreadsheet("A1"), "R1C1")
  2. test.assert_equals(spreadsheet("R1C1"), "A1")
  3. test.assert_equals(spreadsheet("R5C4"), "D5")
  4. test.assert_equals(spreadsheet("AA48"), "R48C27")
  5. test.assert_equals(spreadsheet("BK12"), "R12C63")
  6. test.assert_equals(spreadsheet("R12C63"), "BK12")
  7. test.assert_equals(spreadsheet("R85C26"), "Z85")
  8. test.assert_equals(spreadsheet("R31C78"), "BZ31")
  9. test.assert_equals(spreadsheet("BZ31"), "R31C78")


这个答案不是我写的,我跟re不熟,选了个比较好的答案供各位参考。
  1. import re

  2. def spreadsheet(s):
  3.     nums = re.findall(r'(d+)', s)
  4.     if len(nums) == 2:
  5.         n, cStr = int(nums[1]), ''
  6.         while n:
  7.             n, r = divmod(n-1, 26)
  8.             cStr += chr(r + 65)
  9.         return "{}{}".format(cStr[::-1], nums[0])
  10.     else:
  11.         return "R{}C{}".format(nums[0], sum( 26**i * (ord(c)-64) for i,c in enumerate(re.sub(r'd', '', s)[::-1]))
发表评论
评论通过审核后显示。