【问题标题】:Count upward in python with variable base在具有可变基数的python中向上计数
【发布时间】:2016-03-05 23:51:00
【问题描述】:

我想知道如何在 python 中做一个等效的范围函数,但能够指定基数。例如:

countUp(start=0, end=1010, base=2)
countUp(start=0, end=101, base=3)
countUp(start=0, end=22, base=4)

base 2 计数的示例输出:

[0, 1, 10, 11, 100, ...]

是否有我缺少的功能可以做到这一点?或者我能做什么?

【问题讨论】:

  • 011011,并不是真正的以 2 为底的计数。只需显示不同基数的数字。无论如何,你不能产生超过 10 个没有字母的碱基。
  • 您可以结合使用range 和某种base conversion 来制作自己的
  • Python 整数没有基数。它们只是整数。

标签: python range base


【解决方案1】:

您显然将数字与数字表示混淆了。

数字没有底...它是有底的数字representation...例如以2为底的“101”表示的数字与表示的数字相同以 10 为底数为“5”。

range 函数将计算连续的数字,您可以通过以下方式以您喜欢的任何基数获得它们的表示:

digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def int2str(x, base):
    if x < 0:
        return "-" + int2str(-x, base)
    return ("" if x < base else int2str(x//base, base)) + digits[x % base]

【讨论】:

    【解决方案2】:

    您可以使用自定义迭代器来做到这一点:

    我从here 获取迭代器代码,从here 获取基本转换

    import string
    class BaseRange:
        def __init__(self, low, high, base):
            digs = string.digits + string.letters
            self.current = low
            self.high = high
            self.base = base
        def __iter__(self):
            return self
        def next(self):  # Python 3 requires this to be __next__
            if self.current > self.high:
                raise StopIteration
            else:
                self.current += 1
                return self.int2base(self.current - 1, self.base)
        def int2base(self, x, base):
            if x < 0: sign = -1
            elif x == 0: return digs[0]
            else: sign = 1
            x *= sign
            digits = []
            while x:
                digits.append(digs[x % base])
                x /= base
            if sign < 0:
                digits.append('-')
                digits.reverse()
            return ''.join(digits)
    

    几个示例运行产生:

    >>> for c in BaseRange(0, 10, 2):
        print(c)
    
    
    0
    1
    01
    11
    001
    101
    011
    111
    0001
    1001
    0101
    >>> for c in BaseRange(0, 10, 3):
        print(c)
    
    
    0
    1
    2
    01
    11
    21
    02
    12
    22
    001
    101
    

    【讨论】:

      【解决方案3】:

      您不能使用特殊基数创建整数,但您可以在字符串中的指定基数中创建预期数字:

      def my_range(start,end,base,step=1):
      
          def Convert(n,base):
             string = "0123456789ABCDEF"
             if n < base:
                return string[n]
             else:
                return Convert(n//base,base) + string[n%base]
          return (Convert(i,base) for i in range(start,end,step))
      

      演示:

      print list(my_range(4,20,2))
      ['100', '101', '110', '111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111', '10000', '10001', '10010', '10011']
      

      请注意,传递给函数的字符串string = "0123456789ABCDEF" 将一直有效到基数16,如果要计算更大的基数,您可以使用更多的字母。

      【讨论】:

        猜你喜欢
        • 2013-03-09
        • 2014-05-27
        • 2021-08-09
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-14
        相关资源
        最近更新 更多