Вы можете сделать оператор ввода while True loop, чтобы он неоднократно запрашивал вход пользователя и затем прерывал этот цикл, если пользователь вводит ответ, который вам нужен. И вы можете использовать try и except blocks для обработки недействительных ответов.
while True:
var = True
try:
age = int(input("Please enter your age: "))
except ValueError:
print("Invalid input.")
var = False
if var == True:
if age >= 18:
print("You are able to vote in the United States.")
break
else:
print("You are not able to vote in the United States.")
Переменная var такова, что если пользователь вводит строку вместо целого, программа не будет возвращать «Вы не можете голосовать в Соединенных Штатах ».
Рекурсивное решение:
def generator(x: List[List[Int]]): List[List[Int]] = x match {
case Nil => List(Nil)
case h :: _ => h.flatMap(i => generator(x.tail).map(i :: _))
}
, которое дает:
val a = List(List(1, 2, 3), List(4, 5))
val b = List(List(1, 2, 3), List(4, 5), List(6, 7))
generator(a) //> List(List(1, 4), List(1, 5), List(2, 4),
//| List(2, 5), List(3, 4), List(3, 5))
generator(b) //> List(List(1, 4, 6), List(1, 4, 7), List(1, 5, 6),
//| List(1, 5, 7), List(2, 4, 6), List(2, 4, 7),
//| List(2, 5, 6), List(2, 5, 7), Listt(3, 4, 6),
//| List(3, 4, 7), List(3, 5, 6), List(3, 5, 7))
Обновление: второе case
также может быть записано как понимание for
, которое может быть немного яснее:
def generator2(x: List[List[Int]]): List[List[Int]] = x match {
case Nil => List(Nil)
case h :: t => for (j <- generator2(t); i <- h) yield i :: j
}
Обновление 2: для больших наборов данных, если у вас закончилась нехватка памяти, вы можете использовать потоки вместо этого (если имеет смысл обрабатывать результаты пошагово). Например:
def generator(x: Stream[Stream[Int]]): Stream[Stream[Int]] =
if (x.isEmpty) Stream(Stream.empty)
else x.head.flatMap(i => generator(x.tail).map(i #:: _))
// NB pass in the data as Stream of Streams, not List of Lists
generator(input).take(3).foreach(x => println(x.toList))
>List(0, 0, 0, 0, 0, 0, 0)
>List(0, 0, 0, 0, 0, 200, 0)
>List(0, 0, 0, 0, 100, 0, 0)
Похоже, ваша проблема может быть описана в терминах рекурсии:
Если у вас есть n списков из списка: int1 list1 размера m и list2, ... list n
, поэтому со списком (список (1,2), список (3), список (4, 5) )) результатом вашего рекурсивного вызова является List (List (3,4), List (3,5)), и для каждого вы добавляете 2 комбинации: List (1,3,4), List (2,3,4) , Список (1,3,5), Список (2,3,5).
-Xmx
– DNA 2 May 2014 в 22:48