我的代码未产生预期的结果

时间:2018-08-28 12:38:38

标签: python python-3.x list

我想要代码执行的操作是打印包含数字的列表:

  • 两位或三位数字的乘积
  • 回文症
  • 在[101101,1000000)范围内。

最终列表中不应包含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的重复项。我不好在不检查现有银行的问题。

2 个答案:

答案 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位数字列表中删除元素时会发生什么情况:

  1. 从列表开始,并ii引用第一个数字:

      10001, 20002, 30003, 40004, ...
        ^
        ii
    
  2. 从列表中删除ii

      20002, 30003, 40004, ...
    
        ii -> 10001
    

    ii仍然是有效参考,但不是对列表中的项目的引用。该列表自然会向后移动一个元素。

  3. 继续循环到下一个元素:

      20002, 30003, 40004, ...
               ^
               ii
    

希望您能看到如何跳过要过滤掉的相邻元素。

您有许多可行的解决方法。以下是一些入门指南:

  1. 使用列表理解来创建新列表:

      list1 = [x for x in list1 if len(x) > 5]
    
  2. 完全摆脱有问题的循环,并且仅在第一个循环中的字符串长于报废的字符串时,才将其追加到列表中。

  3. 向后迭代,因此移动不会影响您:

     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。