Python - Перебор нескольких словарей и их ключей - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь создать программу, в которой пользователь может вводить несколько номеров лотерейных билетов и сравнивать эти номера с набором выигрышных номеров. Я знаю, что могу заставить его работать, используя несколько операторов if, но я думаю, что должен быть способ сделать это в al oop. Я пробовал несколько циклов, которые использовали «for key in ___», но продолжал получать ошибки.

amount = int(input('How many sets of numbers do you have?'))
tickets = {}
ticketMatch = {}
winingNumbers = {
    '1': '1',
    '2': '2',
    '3': '3',
    '4': '4',
    '5': '5',
    '6': '6',
}

for i in range (0, amount, 1):
    tickets[i] = {
        '1': input('Input #1 '),
        '2': input('Input #2 '),
        '3': input('Input #3 '),
        '4': input('Input #4 '),
        '5': input('Input #5 '),
        '6': input('Input Powerball '),
    }


for i in range (0, len(tickets), 1):
    ticketMatch[i] = 0
    if tickets[i]['1'] in winingNumbers.values():
        ticketMatch[i] += 1
    if tickets[i]['2'] in winingNumbers.values():
        ticketMatch[i] += 1

Любые подсказки были бы очень признательны. Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Перебирать любой словарь довольно просто. Допустим, у нас есть следующий словарь:

d = {
    "a": 1,
    "z": 26
}

, и мы хотели распечатать ключи с их значениями.

for key in d: # note, key represents "a" and "z"
    print(key, d[key])

Однако для целей того, что вы пытаетесь выполнить sh, словари могут и не понадобиться, как прокомментировал @ggorlen.

Быстрое воспроизведение, которое я придумал, чтобы сделать то же самое

query = "enter a lottery number or 'quit' to quit: "
entries = input(query)
numbers = []
while entries != "quit":
    numbers.append(entries)
    entries = input(query)

winning_numbers = "123456"

for i in range(len(numbers)):
    if numbers[i] == winning_numbers:
        print(f"ticket {i} is a winner!")

Я не уверен, почему вы сравниваете номера 1 и 2 каждого билета с общими выигрышными номерами, потому что обычные лотереи работают не так, поэтому моя версия выглядит немного иначе, но, конечно, вы могли бы легко внести это изменение, если бы это было то, что вы хотели.

0 голосов
/ 29 мая 2020
  • Словари имеют смысл только в том случае, если у вас есть ключ и с его помощью хранится значение. Доступ к значению ключа и проверка того, является ли ключ частью словаря, выполняется быстро (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.

См .:

0 голосов
/ 29 мая 2020
amount = int(input('How many sets of numbers do you have?'))
winingNumbers = {1, 2, 3, 4, 5, 6}
tickets = [set() for _ in range(amount)]
ticketMatch = []


for i in range(amount):
    for j in range(6):
        if j == 5:
            tickets[i].add(int(input("Input Powerball ")))
        else:
            tickets[i].add(int(input("Input #" + str(j + 1) + " ")))

for i in range(amount):
    ticketMatch.append(len(tickets[i] & winingNumbers))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...