Python列出自定义基数系统中的前n个条目
我很抱歉,如果标题用词不当和/或没有正确描述这是怎么回事,欢迎您在理解这是怎么回事后编辑标题,使其清楚 这件事很简单,但我发现很难描述,这件事有点像一个数字系统,除了它是关于整数列表 所以我们从一个只有零的整数列表开始,在每次迭代中,我们向其中添加一个,直到达到某个极限,然后在列表的开头插入1,将第二个元素设置为0,然后在第二个元素上迭代,直到再次达到极限,然后向第一个元素添加1,并将第二个元素设置为0,当第一个元素达到极限时,在列表开始处插入另一个值为1的元素,然后将其后面的两个元素归零,等等 就像这样,当一个位置达到限制时,将该位置及其后的位置置零,将其前的位置增加1,当所有可用位置达到限制时,在左侧添加1,例如:Python列出自定义基数系统中的前n个条目,python,loops,Python,Loops,我很抱歉,如果标题用词不当和/或没有正确描述这是怎么回事,欢迎您在理解这是怎么回事后编辑标题,使其清楚 这件事很简单,但我发现很难描述,这件事有点像一个数字系统,除了它是关于整数列表 所以我们从一个只有零的整数列表开始,在每次迭代中,我们向其中添加一个,直到达到某个极限,然后在列表的开头插入1,将第二个元素设置为0,然后在第二个元素上迭代,直到再次达到极限,然后向第一个元素添加1,并将第二个元素设置为0,当第一个元素达到极限时,在列表开始处插入另一个值为1的元素,然后将其后面的两个元素归零,等等
0
1
2
1, 0
1, 1
1, 2
2, 0
2, 1
2, 2
1, 0, 0
限制不必是三个
这就是我目前拥有的类似于此的功能:
array = []
for c in range(26):
for b in range(26):
for a in range(26):
array.append((c, b, a))
我不想要前导零,但我可以删除它们,但我不知道如何使用数量可变的元素来实现这一点
我想要的是一个函数,它接受两个参数,limit(或base)和要返回的元组数,并按顺序返回前n个这样的元组
这一定很简单,但我就是搞不懂,谷歌返回的结果完全不相关,所以我在这里寻求帮助
如何做到这一点?我们真诚地感谢您的帮助
嗯,我在想这样的事情,但很不幸我不能让它工作,请帮我弄清楚为什么它不工作,以及如何使它工作:
array=[]
数字=[0]
对于范围(1000)内的i:
数字[-1]+=1
26人:
索引=数字。索引(26)
数字[索引:][0]*(len(数字)-索引)
如果索引!=0:
数字[索引-1]+=1
其他:
数字。插入(0,1)
array.append(数字)
我不太明白,我的测试表明,在循环外,循环内的一切工作都很好,结果是正确的,但它只是神奇地无法在循环中工作,我不知道原因,这很奇怪
我发现,如果我将最后一行更改为“打印(数字)”,那么所有内容都可以正确打印,但如果我使用“附加”,则只会添加最后一个元素,这是怎么回事?我终于做到了
from math import log
def number_to_base(n,base):
number=[]
for digit in range(int(log(n+0.500001,base)),-1,-1):
number.append(n//base**digit%base)
return number
def first_numbers_in_base(n,base):
numbers=[]
for i in range(n):
numbers.append(tuple(number_to_base(i,base)))
return numbers
#tests:
print(first_numbers_in_base(10,3))
print(number_to_base(1048,10))
print(number_to_base(int("10201122110212",3),3))
print(first_numbers_in_base(25,10))
逻辑非常简单,但困难的部分是找出它为什么不能在循环中工作,结果我需要使用.copy()
,因为无论出于什么原因,对列表进行就地修改都会直接修改驻留在其内存空间中的数据,这样的行为会修改相同的内存空间,.append()
方法始终在内存空间中追加最新数据
下面是代码:
def步数(基数,num):
数组=[]
数字=[0]
对于范围内的i(num):
copy=number.copy()
复制[-1]+=1
而在复制中的基础:
index=copy.index(基本)
复制[索引:][0]*(len(复制)-索引)
如果索引!=0:
复制[索引-1]+=1
其他:
复制。插入(0,1)
array.append(复制)
数字=副本
返回数组
像这样使用它:
steps(26, 1000)
对于base 26中的前1000个列表。这里有一个函数,它将满足原始要求(返回元组列表,第一个元组表示0),并且比已发布到此线程的其他函数更快:
def first_numbers_in_base(n,base):
if n<2:
if n:
return [(0,)]
return []
numbers=[(0,),(1,)]
base-=1
l=-1
num=[1]
for i in range(n-2):
if num[-1]==base:
num[-1]=0
for i in range(l,-1,-1):
if num[i]==base:
num[i]=0
else:
num[i]+=1
break
else:
num=[1]+num
l+=1
else:
num[-1]+=1
numbers.append(tuple(num))#replace tuple(num) with num.copy() if you want resutl to contain lists instead of tuples.
return numbers
def first_number_in_base(n,base):
如果你需要这个帮助?您可以通过删除行“numbers=copy”并将变量“copy”替换为变量“numbers”来加快速度。@user2952903我知道我在做什么,我故意选择使用numbers
变量的副本,因为单独使用数字会产生意外结果并破坏代码,这正是这个问题的目的……我认为如果“for I in range(num):”后面的行是“numes=numes.copy()”,它不会给出意外的结果。我发布了一个更好的函数,它做的事情几乎相同,但更快,作为一个新的答案。