我不知道为什么这个for循环程序不起作用(python)。解决方案?

时间:2019-12-13 17:22:48

标签: python for-loop

我正在尝试制作一个程序,该程序将某个范围内的数字排序,如果数字以升序排列或保持不变,则将其放入列表。我已经尝试过了:

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。

据我所知,代码的第一部分正在工作,但似乎只是跳过了第二部分。

有人知道为什么吗?

2 个答案:

答案 0 :(得分:1)

您的问题的答案是:第二个循环的范围不满足给定条件。

通过合并它们,您可以做一件事来摆脱深层嵌套的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)]

的示例输出

[(2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 3), (2, 3, 4), (3, 3, 3), (3, 3, 4)]

答案 1 :(得分:0)

对于这样的事情,我会考虑将整数更改为字符串,以便您可以对它们进行迭代和排序,而不是使用嵌套的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)

看看输出。