迭代类似excel的字符组合范围

时间:2015-09-17 11:54:09

标签: python python-3.x

我有一个字符串,其中包含范围中的第一列,以及范围中的最后一列 - 例如AF:IK

如何判断'BX'是否在给定范围内?

3 个答案:

答案 0 :(得分:5)

这个问题可以被视为类似于你处理基数26数学问题的方法。让我们处理A = 1,B = 2,C = 3等。然后AA将是1 * 26 + 1。

让我们在Python中表达这个

letters = '0ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def ordinal(values):
  result = 0
  for value in values:
     result *= 26
     result += letters.index(value)
  return result

print ordinal('A')
# should be 1

print ordinal('AA')
# should be 27

print ordinal('AF')
# should be 33

print ordinal('IK')
# should be 254

print ordinal('AF') < ordinal('BX') < ordinal('IK')
# should be True

答案 1 :(得分:5)

利用base的{​​{1}}参数 - 它可以高达36。

int

(我使用>>> from functools import partial >>> ht = partial(int, base=36) >>> >>> r = "AF:IK" >>> lo, hi = r.split(':') >>> ht(lo) < ht("BX") < ht(hi) True >>> ht(lo) < ht("BXA") < ht(hi) False 创建了函数ht,以便更简单地使用。)

答案 2 :(得分:1)

这样的事情应该这样做:

    #!/usr/bin/env python

    def to_base26(string):
        # Convert an alphabet string base 26
        col = 0
        pos = 0
        for char in string.upper()[::-1]:
            col += 26**pos * (ord(char) - ord('A') + 1)
            pos += 1

        return col

    def check_range(lower,upper,query):
        if to_base26(lower) <= to_base26(query) and to_base26(query) <= to_base26(upper):
            print 'In Range'
        else:
            print 'Not in Range'

    check_range('AF', 'IK', 'BX')