Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列出自定义基数系统中的前n个条目_Python_Loops - Fatal编程技术网

Python列出自定义基数系统中的前n个条目

Python列出自定义基数系统中的前n个条目,python,loops,Python,Loops,我很抱歉,如果标题用词不当和/或没有正确描述这是怎么回事,欢迎您在理解这是怎么回事后编辑标题,使其清楚 这件事很简单,但我发现很难描述,这件事有点像一个数字系统,除了它是关于整数列表 所以我们从一个只有零的整数列表开始,在每次迭代中,我们向其中添加一个,直到达到某个极限,然后在列表的开头插入1,将第二个元素设置为0,然后在第二个元素上迭代,直到再次达到极限,然后向第一个元素添加1,并将第二个元素设置为0,当第一个元素达到极限时,在列表开始处插入另一个值为1的元素,然后将其后面的两个元素归零,等等

我很抱歉,如果标题用词不当和/或没有正确描述这是怎么回事,欢迎您在理解这是怎么回事后编辑标题,使其清楚

这件事很简单,但我发现很难描述,这件事有点像一个数字系统,除了它是关于整数列表

所以我们从一个只有零的整数列表开始,在每次迭代中,我们向其中添加一个,直到达到某个极限,然后在列表的开头插入1,将第二个元素设置为0,然后在第二个元素上迭代,直到再次达到极限,然后向第一个元素添加1,并将第二个元素设置为0,当第一个元素达到极限时,在列表开始处插入另一个值为1的元素,然后将其后面的两个元素归零,等等

就像这样,当一个位置达到限制时,将该位置及其后的位置置零,将其前的位置增加1,当所有可用位置达到限制时,在左侧添加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()”,它不会给出意外的结果。我发布了一个更好的函数,它做的事情几乎相同,但更快,作为一个新的答案。