簡體   English   中英

為什么我的代碼沒有產生預期的結果?

[英]Why my code doesn't generate the expected result?

我想讓代碼做的是打印包含以下數字的列表:

  • 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的副本。 我不檢查現有銀行中的問題是我的錯。

這是解決您問題的最簡單方法;

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)

這是為什么不就地修改列表的教科書示例。 罪魁禍首是這個循環:

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 即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM