- Словари имеют смысл только в том случае, если у вас есть ключ и с его помощью хранится значение. Доступ к значению ключа и проверка того, является ли ключ частью словаря, выполняется быстро (
O(1)
) - итерация всех значений dict
выполняется так же медленно, как list
, но создание словаря происходит медленнее, чем создание list
и занимают больше памяти вашего компьютера. - Использование операций
set
, избегайте использования if's
каскадов - пример см. Ниже.
Более быстрый ввод в al oop можно выполнить с помощью split()
и списка разложение *a,b=[1,2,3,4]
:
for _ in range(int(input("How many tickets do you want to enter? "))):
*nums, power = map(int,
input( ("Input space seperated numbers of your ticket,"
" last one is Powerball: ") ).strip().split())
print(nums, power)
Вывод:
How many tickets do you want to enter? 3
Input space seperated numbers of your ticket, last one is Powerball: 1 2 3 4 99
[1, 2, 3, 4] 99
Input space seperated numbers of your ticket, last one is Powerball: 2 3 4 7 199
[2, 3, 4, 7] 199
Input space seperated numbers of your ticket, last one is Powerball: 4 2 4 5 6
[4, 2, 4, 5] 6
(Хотя некоторые дополнительные проверки могут быть уместны для пользователей, которые вообще не вводят числа или слишком мало / вне диапазона : Запрашивать у пользователя ввод до тех пор, пока он не даст правильный ответ )
Для сравнений лото можно быстро проверить правильность списка «билетов» с набором () чисел каждый номера с использованием set
-операций.
Проверка списка билетов будет O(n)
(с n
== количеством билетов) - проверка совпадения чисел с вашими выигрышными числами выполняется быстро: O(1)
и позволяет избежать if ..:
.
Вы можете сделать это так (полностью случайный пример):
import random
def random_nums():
"""Returns a tuple of a frozenset of 5 numbers in the range [1..69]
and one number in the range of [1..26] (aka: USA Powerball Lottery)"""
return ( frozenset(random.sample(range(1,70), 5)), random.choice(range(1,27)) )
# draw the win-numbers
winning_nums = set(random.sample(range(1,70), 5))
powerball = random.choice(range(1,27))
# print them
print("Winner: ", *winning_nums, " Powerball: ", powerball)
# generate random tickets
tickets = [ random_nums() for _ in range(10) ]
# check if ticket got something in common with winner numbers
for (nums, power) in tickets:
# fast set operations
intersect = sorted(nums.intersection(winning_nums))
wrong = sorted(nums.difference(winning_nums))
p = 'correct' if power == powerball else 'wrong'
n = "'nothing'"
# some output
print( ( f"You got {intersect or n} correct and guessed "
f"{wrong or n} wrong. Powerball: {p}.") )
Вывод:
Winner: 14 49 26 27 60 Powerball: 6
You got [49] correct and guessed [21, 41, 59, 66] wrong. Powerball: wrong.
You got [60] correct and guessed [17, 19, 63, 68] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [10, 21, 51, 67, 69] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [18, 30, 40, 45, 52] wrong. Powerball: wrong.
You got [26, 27] correct and guessed [11, 37, 58] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [28, 33, 38, 59, 65] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [11, 18, 35, 61, 64] wrong. Powerball: wrong.
You got 'nothing' correct and guessed [2, 3, 47, 54, 63] wrong. Powerball: wrong.
You got [14] correct and guessed [23, 25, 58, 66] wrong. Powerball: wrong.
You got [27] correct and guessed [47, 52, 56, 58] wrong. Powerball: correct.
См .: