![](/img/trans.png)
[英]Java program doesn't work like python program and I don't know why
[英]I don't know why this for loop program doesn't work (python). Solutions?
我正在嘗試制作一個程序,它在一個范圍內對數字進行排序,如果數字按升序排列或保持不變,則將它們放入一個列表中。 我試過這個:
numbers1 = []
for count1 in range(2, 3):
for count2 in range(0, 10):
for count3 in range(0, 10):
for count4 in range(0, 10):
for count5 in range(0, 10):
for count6 in range(0, 10):
number = (count1,count2,count3,count4,count5,count6)
if number[5] >= number[4]:
if number[4] >= number[3]:
if number[3] >= number[2]:
if number[2] >= number[1]:
if number[1] >= number[0]:
numbers1.append(number)
print("Done")
input()
numbers2 = []
for count1b in range(3, 8):
for count2b in range(0, 5):
for count3b in range(0, 7):
for count4b in range(0, 4):
for count5b in range(0, 3):
for count6b in range(0, 6):
number = (count1b,count2b,count3b,count4b,count5b,count6b)
if number[5] >= number[4]:
if number[4] >= number[3]:
if number[3] >= number[2]:
if number[2] >= number[1]:
if number[1] >= number[0]:
numbers2.append(number)
print("Done")
但是當我運行它並在命令提示符中鍵入 numbers2 時,它只返回一個空列表。 numbers1 返回從 200000 到 299999 的完整數字列表,這些數字遵循我上面解釋的規則。
據我所知,代碼的第一部分正在運行,但似乎只是跳過了第二部分。
有誰知道為什么?
您的問題的答案是:第二個循環具有不滿足給定條件的不同范圍。
你可以做一件事來通過組合它們來擺脫深層嵌套的if
塊
if number[5] >= number[4] and number[4] >= number[3] and number[3] >= number[2] and number[2] >= number[1] and number[1] >= number[0]:
或者更好
if number[5] >= number[4] >= number[3] >= number[2] >= number[1] >= number[0]:
這是整個任務的替代和更靈活的方法。
import itertools
def restrictions(values):
return all(x <= y for x, y in zip(values, values[1:]))
limits = [(2, 3), (0, 10), (0, 10), (0, 10), (0, 10), (0, 10)]
ranges = [range(a, b) for a, b in limits]
all_combinations = itertools.product(*ranges)
filtered_combinations = filter(restrictions, all_combinations)
print(list(filtered_combinations))
您可以更改limits
的值,也可以將元組添加到該列表或刪除它們。
limits = [(2, 4), (2, 4), (2, 5)]
示例輸出limits = [(2, 4), (2, 4), (2, 5)]
[(2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (3, 3, 3), (3, 3, 4)]
對於這樣的事情,我會考慮將整數更改為字符串,以便您可以迭代它們並對它們進行排序,而不是使用嵌套的 for 循環。
下面是我的方法,將其分解為 3 個獨立的函數,使其更容易理解。 最后一個函數 find_ordered_digits 將返回指定范圍內滿足您的條件(數字從左到右增加)的所有數字的列表。
def get_digits(number):
digit_list = []
number_string = str(number)
for str_num in number_string:
try:
digit_list.append( int(str_num) )
except ValueError:
print("ValueError: get_digits can only accept type int")
digit_list = 0
break
return digit_list
def are_digits_ordered(num_list):
if num_list == sorted(num_list):
return True
else:
return False
def find_ordered_digits(start, end):
ordered_digit_nums = []
for num in list( range(start, end + 1) ):
if are_digits_ordered( get_digits(num) ):
ordered_digit_nums.append(num)
return ordered_digit_nums
print(get_digits(387495820))
print(get_digits(239.1))
print (are_digits_ordered(get_digits(1234)))
print (are_digits_ordered(get_digits(1294)))
print (find_ordered_digits(1000, 1200))
輸出:
[3, 8, 7, 4, 9, 5, 8, 2, 0]
ValueError: get_digits can only accept type int
0
True
False
[1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1122, 1123, 1124,
1125, 1126, 1127, 1128, 1129, 1133, 1134, 1135, 1136, 1137, 1138, 1139,
1144, 1145, 1146, 1147, 1148, 1149, 1155, 1156, 1157, 1158, 1159, 1166,
1167, 1168, 1169, 1177, 1178, 1179, 1188, 1189, 1199]
我特意以稍微冗長和明確的方式寫了這篇文章,以使其更加明顯,並使其更加靈活。 它肯定可以被壓縮很多,嘗試重寫它以使其盡可能短可能是一個很好的練習。 Matthias 的回答更加簡潔和高效,我會用 Python 風格說更多,也更具體。
最后,我不確定您正在使用的嵌套 for 循環是否正在執行您期望的操作。 嘗試在您的代碼中添加更多的 print() 語句以查看實際發生的情況。 例如,嘗試在 if 語句之前添加以下內容:
print(count6b)
print(count5b)
並查看輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.