Python-数字的旋转
我试图创建一个代码,它将接受给定的整数,然后输出一组整数,所有这些整数都是输入整数的数字旋转 因此,如果我输入'197',输出应该是'197','971','791' 但是,当我尝试时:Python-数字的旋转,python,python-3.x,Python,Python 3.x,我试图创建一个代码,它将接受给定的整数,然后输出一组整数,所有这些整数都是输入整数的数字旋转 因此,如果我输入'197',输出应该是'197','971','791' 但是,当我尝试时: def rotation(n): rotations = set() for i in range( len( str(n) ) ): n = int( str(n)[i:] + str(n)[:i] ) rotations.add(n) 对于输入“197”,它只返回“197”、“97
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
n = int( str(n)[i:] + str(n)[:i] )
rotations.add(n)
对于输入“197”,它只返回“197”、“971”,而不是“791”
为什么会发生这种情况?你就快到了。除了在每次迭代中删除输入n。使用另一个变量名
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
m = int( str(n)[i:] + str(n)[:i] )
rotations.add(m)
return rotations
print(rotation(197))
我会这样写,用一套理解:
def rotation(number):
str_number = str(number)
return {
int( str_number[i:] + str_number[:i] )
for i in range(len(str_number))
}
由@Henry Woody编写的解决方案2也不错。不要在每次迭代时按
i
旋转输入字符串,而是从上一次迭代开始按1
旋转。您就快到了。除了在每次迭代中删除输入n。使用另一个变量名
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
m = int( str(n)[i:] + str(n)[:i] )
rotations.add(m)
return rotations
print(rotation(197))
我会这样写,用一套理解:
def rotation(number):
str_number = str(number)
return {
int( str_number[i:] + str_number[:i] )
for i in range(len(str_number))
}
由@Henry Woody编写的解决方案2也不错。不要在每次迭代时按
i
旋转输入字符串,而是从上一次迭代开始按1
旋转。构建代码的方式会重复旋转,因为在循环的每个步骤上重新分配n
,并在切片中使用迭代变量i
因此,您示例中的循环过程是:
i=0
- 您有
,而旋转逻辑对n=197
没有任何作用,因此您将i=0
添加到旋转中197
- 您有
i=1
- 同样,您有
,旋转逻辑使n=197
并将其添加到n=971
旋转中
- 同样,您有
i=2
- 现在
,索引n=971
中的旋转逻辑切片,但是2
已经旋转,因此我们再次使用n
,它被添加到n=197
旋转中(由于
是一个集合,因此被删除)。基本上,旋转
已经向前旋转,现在正向前旋转2步(返回初始值并跳过n
)n=719
- 现在
n
保持在其初始值,并在每个步骤上旋转n
全部金额(i
),并将其添加到旋转中,而不进行修改n
。像这样:
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
rotations.add(int( str(n)[i:] + str(n)[:i] ))
return rotations
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
n = int( str(n)[1:] + str(n)[:1] )
rotations.add(n)
return rotations
2.在每一步上向前旋转n
,但每次只向前旋转一个位置。像这样:
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
rotations.add(int( str(n)[i:] + str(n)[:i] ))
return rotations
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
n = int( str(n)[1:] + str(n)[:1] )
rotations.add(n)
return rotations
您构建代码的方式会重复循环,因为您在循环的每个步骤上重新分配n
,并在切片中使用迭代变量i
因此,您示例中的循环过程是:
i=0
- 您有
n=197
,而旋转逻辑对i=0
没有任何作用,因此您将197
添加到旋转中
i=1
- 同样,您有
n=197
,旋转逻辑使n=971
并将其添加到旋转中
i=2
- 现在
n=971
,索引2
中的旋转逻辑切片,但是n
已经旋转,因此我们再次使用n=197
,它被添加到旋转中(由于旋转
是一个集合,因此被删除)。基本上,n
已经向前旋转,现在正向前旋转2步(返回初始值并跳过n=719
)
要解决此问题,您可以:
1.将n
保持在其初始值,并在每个步骤上旋转n
全部金额(i
),并将其添加到旋转中,而不进行修改n
。像这样:
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
rotations.add(int( str(n)[i:] + str(n)[:i] ))
return rotations
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
n = int( str(n)[1:] + str(n)[:1] )
rotations.add(n)
return rotations
2.在每一步上向前旋转n
,但每次只向前旋转一个位置。像这样:
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
rotations.add(int( str(n)[i:] + str(n)[:i] ))
return rotations
def rotation(n):
rotations = set()
for i in range( len( str(n) ) ):
n = int( str(n)[1:] + str(n)[:1] )
rotations.add(n)
return rotations
只是好奇,为什么你不想要179917和719呢?要么重新分配n
(并在索引0
处处理元素),要么处理索引i
(并将结果分配给一个临时变量。不要两者兼而有之。在一张纸上写下你想要做的事情,你会明白的。@YunkaiXiao他想要旋转,不是排列。@Jérôme那么应该是719而不是791对吗?@YunkaiXiao对。这是操作中的一个错误,我没有注意到。只是好奇,为什么你不想要179、917和719?要么重新分配n
(在索引0
处使用元素),要么使用索引I
(并将结果分配给一个临时变量。不要两者都做。在一张纸上写下你想做的事情,你会明白的。:)@云开霄他想要的是轮换,而不是排列。@Jérôme那么应该是719而不是791对吧?@YunkaiXiao对。这是OP中的一个错误,我没有注意到。哈哈,我正要发布这个答案,唯一的区别是我用了x而不是m:)(或者干脆去掉变量)哈哈,我正要发布这个答案,唯一的区别是我用了x而不是m:)(或者干脆去掉变量)