Python 从列表中取消反向编号

Python 从列表中取消反向编号,python,python-3.x,list,reverse,Python,Python 3.x,List,Reverse,假设我根据一些标准列出一个正整数列表,如下所示: N = 100 List_1 = range(12, N, 1) # Cancelling multiples of 10 List_2 = [x for x in List_1 if x%10] # Cancelling palindromic numbers List_3 = [x for x in List_2 if str(x)!=str(x)[::-1]] 因此,我最后获得的列表(list_3)是: [12, 13, 14, 15

假设我根据一些标准列出一个正整数列表,如下所示:

N = 100
List_1 = range(12, N, 1)

# Cancelling multiples of 10
List_2 = [x for x in List_1 if x%10]

# Cancelling palindromic numbers
List_3 = [x for x in List_2 if str(x)!=str(x)[::-1]]
因此,我最后获得的列表(
list_3
)是:

[12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 27, 28, 29, 31, 32, 34, 35, 36, 37, 38, 39, 41, 42, 43, 45, 46, 47, 48, 49, 51, 52, 53, 54, 56, 57, 58, 59, 61, 62, 63, 64, 65, 67, 68, 69, 71, 72, 73, 74, 75, 76, 78, 79, 81, 82, 83, 84, 85, 86, 87, 89, 91, 92, 93, 94, 95, 96, 97, 98]
现在,我想从该列表中取消所有与列表中先前的编号相反的编号,例如:

取消
21
,因为
21
与列表中先前的
12
相反

取消
31
,因为
31
与列表中先前的
13
相反

等等

取消
98
,因为
98
与列表中先前的
89
相反

所以最后,列表应该减少到(
list_4
):


我没有找到正确的方法,除了在列表上循环测试一个数字是否与前一个数字相反,这不是很有效。有没有办法用一种更“pythonic”的方式来获取这个
列表4

一种方法是,任何你反转的元素(
13
->
31
)都会在列表中占有一个位置,而你只想保留索引较低的元素:

List_4 = [x for x in List_3 if List_3.index(x) < List_3.index(int(str(x)[::-1]))]
其他考虑 还有另一种方法可以按当前状态生成
列表4

List_4 = [10*x+y for x in range(1,10) for y in range(x+1,10)]
感谢
wjandrea
把我从
字符串中拉出来


看待这一点的一种方法是,您反转的任何元素(
13
->
31
)都将在列表中有一个位置,并且您只希望保留索引较低的元素:

List_4 = [x for x in List_3 if List_3.index(x) < List_3.index(int(str(x)[::-1]))]
其他考虑 还有另一种方法可以按当前状态生成
列表4

List_4 = [10*x+y for x in range(1,10) for y in range(x+1,10)]
感谢
wjandrea
把我从
字符串中拉出来


通过添加一些if条件,可以使用单循环获得列表

res = []
for n in range(12, N):
    r = int(str(n)[::-1])
    if n not in res and r not in res and n != r and n%10:
        res.append(n)
print(res)
输出:

[12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 78, 79, 89]

通过添加一些if条件,可以使用单循环获得列表

res = []
for n in range(12, N):
    r = int(str(n)[::-1])
    if n not in res and r not in res and n != r and n%10:
        res.append(n)
print(res)
输出:

[12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 78, 79, 89]
像这样:

N = 100
List_1 = range(12, N, 1)

# Cancelling multiples of 10
List_2 = [x for x in List_1 if x%10]

# Cancelling palindromic numbers
List_3 = [x for x in List_2 if str(x)!=str(x)[::-1]]

list_4 = []
for n in List_3:
    if int(str(n)[::-1]) not in list_4:
        list_4.append(n)
像这样:

N = 100
List_1 = range(12, N, 1)

# Cancelling multiples of 10
List_2 = [x for x in List_1 if x%10]

# Cancelling palindromic numbers
List_3 = [x for x in List_2 if str(x)!=str(x)[::-1]]

list_4 = []
for n in List_3:
    if int(str(n)[::-1]) not in list_4:
        list_4.append(n)
肾盂有效 说明 我们将任何数字
x
映射到
min(x,int(str(x)[::-1])
,这是数字与其反面之间较小的一个。因此12和21都映射到12。我们将映射的数字构造到一个集合,这样重复的数字就被取消。最后我们将集合转换回一个列表

这是有效的,因为我们只需要在原始列表上进行一次扫描。

Pythonic和effect 说明 我们将任何数字
x
映射到
min(x,int(str(x)[::-1])
,这是数字与其反面之间较小的一个。因此12和21都映射到12。我们将映射的数字构造到一个集合,这样重复的数字就被取消。最后我们将集合转换回一个列表


它非常有效,因为我们只需要对原始列表进行一次扫描。

为了提高效率,可以在单次扫描中构建(并过滤)结果列表

过滤器:

  • 不能被10整除的
  • 非回文
  • 不以回文形式存在
例如:

N = 100
l = []
for i in range(12, N):
    p = str(i)[::-1]
    if all([i % 10, 
            str(i) != p,
            int(p) not in l]):
        l.append(i)
输出:

[12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 
 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 
 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 
 78, 79, 89]

为了提高效率,可以在单程中构建(并过滤)结果列表

过滤器:

  • 不能被10整除的
  • 非回文
  • 不以回文形式存在
例如:

N = 100
l = []
for i in range(12, N):
    p = str(i)[::-1]
    if all([i % 10, 
            str(i) != p,
            int(p) not in l]):
        l.append(i)
输出:

[12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 
 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 
 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 
 78, 79, 89]

也许是这样的:

列表4=列表(映射(str,列表3)) >>>[列表_4.如果列表_4中的i[::-1],则为列表_4中的i移除(i[:-1])] >>>清单4 [12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 78, 79, 89] >>>
可能是这样的:

列表4=列表(映射(str,列表3)) >>>[列表_4.如果列表_4中的i[::-1],则为列表_4中的i移除(i[:-1])] >>>清单4 [12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 78, 79, 89] >>>
那么你想从列表_2中全部反转,并从列表_3中删除它们?我想在列表_3中找到反转数字,并从列表_3中删除它们以获得列表_4注意,
列表_1
是一个
范围
,而不是一个
列表
。那么你想从列表_2中全部反转,并且你想从列表_3中删除它们?我想找到反转请注意,
List\u 1
是一个
范围
,而不是一个
列表
。很好。你可以只
append(n)
而不是
append(str(n))
,然后再转换成
int
。这些列表都是以
int
开头的。啊,是的,我刚刚意识到:)很好的一个。你可能只是
append(n)
而不是
append(str(n))
然后再转换成
int
。列表都以
int
开始。啊,是的,我刚刚意识到:)很好的python方式!用另一种方法更容易计算:
[x*10+y代表范围内的x(1,10)代表范围内的y(x+1,10)]
@wjandrea:)确实:)陷入了思考
str
:-)很好的pythonic方式!用另一种方式更容易计算:
[x*10+y代表范围内的x(1,10)代表范围内的y(x+1,10)]
@wjandrea:)确实:)陷入了思考
str
:-)不错!这使得在一个循环中完成整个过程变得很容易。请随意添加到答案中。很好!这使得在一个循环中完成整个过程变得很容易。请随意将其添加到答案中。