我想要代码执行的操作是打印包含数字的列表:
最终列表中不应包含5位数字,并且某些6位数字应小于101101。但是经过处理后,仍有5位数字。为什么会这样?
list1 = []
for i in range(100, 1000):
for j in range(100, 1000):
if str(i*j) == str(i*j)[::-1]: # checking for palindrome
list1.append(i*j)
list1 = list(set(list1)) # removing duplicates
print(sorted(list1))
# print(len(list1))
for ii in list1: # removing numbers, out of range
if ii < 101101 or ii >= 1000000:
list1.remove(ii)
print(sorted(list1))
# print(len(list1))
但是当我使用集合移除超出范围的元素时,它可以工作。下面给出的代码可以完成这项工作。
set1 = set(range(10000, 101102))
list1 = list(set(list1) - set1)
但是我不明白,为什么先前的代码无法打印所需的输出?
编辑:如您所建议的1,是的,它是this的重复项。我不好在不检查现有银行的问题。
答案 0 :(得分:1)
这是解决问题的最简单方法;
list1 = []
for i in range(100, 1000):
for j in range(100, 1000):
if str(i*j) == str(i*j)[::-1]: # checking for palindrome
list1.append(i*j)
# Use list comprehension to filter unwanted values from the list.
list1 = sorted([value for value in set(list1) if 101101 <= value < 1000000])
print(list1)
答案 1 :(得分:1)
这是一个教科书示例,说明了为什么不就地修改列表。罪魁祸首是这个循环:
for ii in list1: # removing numbers, out of range
if ii < 101101 or ii >= 1000000:
list1.remove(ii)
您已经注意到,list1
的开头部分都是5位数字。列表迭代器按索引进行。让我们看一下从5位数字列表中删除元素时会发生什么情况:
从列表开始,并ii
引用第一个数字:
10001, 20002, 30003, 40004, ...
^
ii
从列表中删除ii
:
20002, 30003, 40004, ...
ii -> 10001
ii
仍然是有效参考,但不是对列表中的项目的引用。该列表自然会向后移动一个元素。
继续循环到下一个元素:
20002, 30003, 40004, ...
^
ii
希望您能看到如何跳过要过滤掉的相邻元素。
您有许多可行的解决方法。以下是一些入门指南:
使用列表理解来创建新列表:
list1 = [x for x in list1 if len(x) > 5]
完全摆脱有问题的循环,并且仅在第一个循环中的字符串长于报废的字符串时,才将其追加到列表中。
向后迭代,因此移动不会影响您:
for ii in reversed(list1):
if ii < 101101 or ii >= 1000000:
list1.remove(ii)
OR
for ii in range(len(list1), -1, -1):
if list1[ii] < 101101 or list1[ii] >= 1000000:
del list1[ii]
就个人而言,我建议使用选项2,因为它最省事。您甚至不需要检查字符串的长度,只需检查数字是否大于99999。