我正在尝试制作一个程序,该程序将某个范围内的数字排序,如果数字以升序排列或保持不变,则将其放入列表。我已经尝试过了:
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。
据我所知,代码的第一部分正在工作,但似乎只是跳过了第二部分。
有人知道为什么吗?
答案 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)
看看输出。