【问题标题】:Why my code doesn't generate the expected result?为什么我的代码没有产生预期的结果?
【发布时间】:2019-02-03 02:28:42
【问题描述】:

我想要代码做的是打印包含以下数字的列表:

  • 2 位或 3 位数字的乘积
  • 回文
  • 在 [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)

但我不明白,为什么前面的代码无法打印所需的输出?

编辑:正如你们中的一位所建议的那样,是的,它是 this 的副本。不检查现有银行的问题是我的坏事。

【问题讨论】:

  • 啊。期望和期望之间的细微差别。
  • @MadPhysicist 这要挂在我的墙上了,谢谢
  • @Milan 我要收藏这个问题,这样当这句话流行起来时,我可以指点这里的人看看起源。至少这是预期的结果;)
  • @MadPhysicist 确实不错。

标签: python python-3.x list


【解决方案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)
    

     for ii in range(len(list1), -1, -1):
          if list1[ii] < 101101 or list1[ii] >= 1000000:
               del list1[ii]
    

就个人而言,我推荐选项 2,因为它最终是最省事的。您甚至不需要检查字符串的长度,只需检查数字是否大于 99999。

【讨论】:

    【解决方案2】:

    这是解决您问题的最简单方法;

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多