簡體   English   中英

我不知道為什么這個 for 循環程序不起作用(python)。 解決方案?

[英]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.

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