在python中反转已转换的字符串

在python中反转已转换的字符串,python,string,python-3.x,reverse,Python,String,Python 3.x,Reverse,我想找出2个3位数的最大回文乘积。 这是我的代码: for i in range(100,1000): for x in range(100,1000): number = i*x number = str(number) if number==number[::-1]: print(number) print("DONE") 它什么也不做,只是完成了打印。 我已将数字转换为字符串,并执行了切片操作,但不起作用。。。刚印好。 我

我想找出2个3位数的最大回文乘积。 这是我的代码:

for i in range(100,1000):
    for x in range(100,1000):
        number = i*x 
        number = str(number)
    if number==number[::-1]:
        print(number)
print("DONE")
它什么也不做,只是完成了打印。 我已将数字转换为字符串,并执行了切片操作,但不起作用。。。刚印好。 我该如何解决这个问题

编辑

我想把回文放在一个列表中,并按大小排序

mylist=[]
for i in range(999,99,-1):
    for x in range(999, i-1, -1,):
        number=i*x
        number=str(number)
        if number==number[::-1]:
            print(number)
            mylist.append(number)
mylist=sorted(mylist)
print("DONE")
for i in mylist:
    for x in mylist:
        if int(i) <= int(x):
            mylist.pop(int(i))
            if x<= i:
                mylist.pop(int(x))
mylist=[]
对于范围(999,99,-1)内的i:
对于范围(999,i-1,-1,)内的x:
数字=i*x
编号=str(编号)
如果数字==数字[:-1]:
打印(数字)
mylist.append(编号)
mylist=已排序(mylist)
打印(“完成”)
对于mylist中的i:
对于mylist中的x:

if int(i)if语句应该在内部for循环中

for i in range(100,1000):
    for x in range(100,1000):
        number = i*x
        number = str(number)
        if number==number[::-1]:
            print(number)
print("DONE")

if语句应该在内部for循环中

for i in range(100,1000):
    for x in range(100,1000):
        number = i*x
        number = str(number)
        if number==number[::-1]:
            print(number)
print("DONE")
关于代码 您应该检查每个数字,这样您的if语句就应该在一个循环中

这都是关于代码的

演出 为了更快地检查,您可以从最大的数字开始检查,然后向下检查

示例:
用于范围(999,99,-1)内的i

U在这里使用999,因为左侧包含,但右侧阈值不包含

下一步是优化内部循环。您不需要检查每个值。只需从999循环到i,以进行最佳检查

使用此alghoritm,您的代码将找到最大的回文数,而无需检查x和i顺序

在您的代码中,它可能会检查30/70,然后检查70/30,例如

固定代码
-1
范围内为步进。所以负一步是向下到第二个数字

关于代码 您应该检查每个数字,这样您的if语句就应该在一个循环中

这都是关于代码的

演出 为了更快地检查,您可以从最大的数字开始检查,然后向下检查

示例:
用于范围(999,99,-1)内的i

U在这里使用999,因为左侧包含,但右侧阈值不包含

下一步是优化内部循环。您不需要检查每个值。只需从999循环到i,以进行最佳检查

使用此alghoritm,您的代码将找到最大的回文数,而无需检查x和i顺序

在您的代码中,它可能会检查30/70,然后检查70/30,例如

固定代码
-1
范围内为步进。所以负一步,它向下移动到第二个数字,我想你正在工作

您可以使用
max

>>> max((i*j,i,j) for i in range(999,99,-1) for j in range(999,i-1,-1) if str(i*j)==str(i*j)[::-1])
(906609, 913, 993)
在这种情况下,这是可行的,因为对于现代计算机来说,元素的数量并不是那么多

但更酷的方法是从最大到最小逐个生成这些数字。那么最大值就是第一个:

def factors(n):    
    ''' function to return the factors of a number '''
    return set(reduce(list.__add__, 
            ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

def pals(n, stop_n=0, length=3):
    ''' Generator to produce palindromes from largest to smallest '''
    while n>stop_n:
        if str(n)==str(n)[::-1]:
            for f1 in factors(n):
                f2=n//f1
                if len(str(int(f1)))==length and len(str(int(f2)))==length:
                    yield n, f1, f2     
        n-=1        


>>> next(pals(999*999))
(906609, 993, 913)
并且可以很容易地用于较大的数字(知道较大的数字可能需要很长时间,但比生成所有数字要快得多):


我想你是在工作

您可以使用
max

>>> max((i*j,i,j) for i in range(999,99,-1) for j in range(999,i-1,-1) if str(i*j)==str(i*j)[::-1])
(906609, 913, 993)
在这种情况下,这是可行的,因为对于现代计算机来说,元素的数量并不是那么多

但更酷的方法是从最大到最小逐个生成这些数字。那么最大值就是第一个:

def factors(n):    
    ''' function to return the factors of a number '''
    return set(reduce(list.__add__, 
            ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

def pals(n, stop_n=0, length=3):
    ''' Generator to produce palindromes from largest to smallest '''
    while n>stop_n:
        if str(n)==str(n)[::-1]:
            for f1 in factors(n):
                f2=n//f1
                if len(str(int(f1)))==length and len(str(int(f2)))==length:
                    yield n, f1, f2     
        n-=1        


>>> next(pals(999*999))
(906609, 993, 913)
并且可以很容易地用于较大的数字(知道较大的数字可能需要很长时间,但比生成所有数字要快得多):


小心你的压痕。您的
if
回文检查发生在…
循环中x的
完成之后。@Adam Smith thx,没有看到!那么我想我也必须缩进打印语句?注意缩进。您的
if
回文检查发生在…
循环中x的
完成之后。@Adam Smith thx,没有看到!那么我想我也必须缩进打印语句?对不起,我,不是y。在Phone上键入很困难此算法在第一次出现时不会找到最大回文。它会在
913*993=906609
之前找到(例如)
924*962=8888888
,因为在检查
993
时,它不会循环到
913
是的,让我们再减去一些。。。我们懂数学,所以不会那么难。。。但是好的,它更快。现在这只是一个加号(只检查唯一值)@MauriceMeyer i不需要定义,因为我们只是用它来迭代Pardon,i,而不是y。在Phone上键入很困难此算法在第一次出现时不会找到最大回文。它会在
913*993=906609
之前找到(例如)
924*962=8888888
,因为在检查
993
时,它不会循环到
913
是的,让我们再减去一些。。。我们懂数学,所以不会那么难。。。但是好的,它更快。这是目前唯一的优点(只检查唯一值)@MauriceMeyer i不需要定义,因为我们只是使用它来迭代