[英]Why my code doesn't generate the expected result?
我想讓代碼做的是打印包含以下數字的列表:
最終列表中應該沒有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 位數字列表中刪除一個元素時會發生什么:
從列表開始,然后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)
要么
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.