2016-12-31 2 views
0

Я создал простой скрипт, который выбирает номер из списка установленных лотерейных номеров, предварительно выбранных нашим комиссаром по фэнтезийному футболу. По результатам этого года фэнтезийные результаты футбола, каждая команда в зависимости от того, насколько хорошо или плохо они сделали в регулярном сезоне получает определенное количество шансов выбрать номер лотереи.Как сделать мой скрипт лотереи Fantasy Football более Pythonic?

Проблема в том, что написанный мной сценарий выбирает все номера для одной команды, прежде чем он перейдет к следующей команде. Я хотел бы, чтобы сценарий выбирал номера по одному, перемещаясь по списку команд. Существует дополнительный уровень сложности, потому что не все команды имеют одинаковое количество шансов на выбор номера лотереи.

Так что я использую счетчики для каждой команды, которая уменьшается до нуля, что означает, что они выбрали все числа, отведенные для них. Я не уверен, как заставить этот сценарий выбирать числа по одному.

Вот мой код:

import random 

lottery_numbers = ['1234','1235','1236','1237','1238','1239', 
'1245','1246','1247','1248','1249','1256','1257','1258','1259', 
'1267','1268','1269','1278','1279','1289','1345','1346','1347', 
'1348','1349','1356','1357','1358','1359','1367','1368','1369', 
'1378','1379','1389','1456','1457','1458','1459','1467','1468', 
'1469','1478','1479','1489','1567','1568','1569','1578','1579', 
'1589','1678','1679','1689','1789','2345','2346','2347','2348', 
'2349','2356','2357','2358','2359','2367','2368','2369','2378', 
'2379','2389','2456','2457','2458','2459','2467','2468','2469', 
'2478','2479','2489','2567','2568','2569','2578','2579','2589', 
'2678','2679','2689','2789','3456','3457','3458','3459','3467', 
'3468','3469','3478','3479','3489','3567','3568','3569','3578', 
'3579','3589','3678','3679','3689','3789','4567','4568','4569', 
'4578','4579','4589','4678','4679','4689','4789','5678','5679', 
'5689','5789','6789'] 

#Lists below will hold the final picks per the random selector and chances defined. 
lori = [] 
danny = [] 
joon = [] 
alex = [] 
abepat = [] 
jonny = [] 
jung = [] 
teho = [] 
jess = [] 

#Chances at lottery numbers used as counters. 
HayanYujaMarinara = 30 
hyobbes = 24 
swoop = 19 
alsizzle = 15 
pabe = 12 
youngbuck = 10 
grimey = 8 
hotay = 5 
sopower = 3 

#Lotto function to randomly select numbers and assign to general manager lists defined above. 
def lotto(): 
    #Define lottery pick chances per commissioner. 
    while HayanYujaMarinara != 0: 
     strong_island = random.choice(lottery_numbers) 
     lori.append(strong_island) 
     lottery_numbers.remove(strong_island) 
     HayanYujaMarinara -= 1 

    while hyobbes != 0: 
     d4l = random.choice(lottery_numbers) 
     danny.append(d4l) 
     lottery_numbers.remove(d4l) 
     hyobbes -= 1 

    while swoop != 0: 
     commish = random.choice(lottery_numbers) 
     joon.append(commish) 
     lottery_numbers.remove(commish) 
     swoop -= 1 

    while alsizzle != 0: 
     texas = random.choice(lottery_numbers) 
     alex.append(texas) 
     lottery_numbers.remove(texas) 
     alsizzle -= 1 

    while pabe != 0: 
     BestFriendsForever = random.choice(lottery_numbers) 
     abepat.append(BestFriendsForever) 
     lottery_numbers.remove(BestFriendsForever) 
     pabe -= 1 

    while youngbuck != 0: 
     oldbuck = random.choice(lottery_numbers) 
     jonny.append(oldbuck) 
     lottery_numbers.remove(oldbuck) 
     youngbuck -= 1 

    while grimey != 0: 
     LittleKidLover = random.choice(lottery_numbers) 
     jung.append(LittleKidLover) 
     lottery_numbers.remove(LittleKidLover) 
     grimey -= 1 

    while hotay != 0: 
     amazebooths = random.choice(lottery_numbers) 
     teho.append(amazebooths) 
     lottery_numbers.remove(amazebooths) 
     hotay -= 1 

    while sopower != 0: 
     soWeak = random.choice(lottery_numbers) 
     jess.append(soWeak) 
     lottery_numbers.remove(soWeak) 
     sopower -= 1 

if __name__ == '__main__': 
    lotto() 
print "[+]" + "Lori's lottery numbers are \n" + str(sorted(lori, key=int)) 
print "**********************************************************" 
print "[+]" + "Danny's lottery numbers are \n" + str(sorted(danny, key=int)) 
print "**********************************************************" 
print "[+]" + "Joon's lottery numbers are \n" + str(sorted(joon, key=int)) 
print "**********************************************************" 
print "[+]" + "Alex's lottery numbers are \n" + str(sorted(alex, key=int)) 
print "**********************************************************" 
print "[+]" + "Pabe's lottery numbers are \n" + str(sorted(abepat, key=int)) 
print "**********************************************************" 
print "[+]" + "Jonny's lottery numbers are \n" + str(sorted(jonny, key=int)) 
print "**********************************************************" 
print "[+]" + "Jung's lottery numbers are \n" + str(sorted(jung, key=int)) 
print "**********************************************************" 
print "[+]" + "Teho's lottery numbers are \n" + str(sorted(teho, key=int)) 
print "**********************************************************" 
print "[+]" + "Jess's lottery numbers are \n" + str(sorted(jess, key=int)) 
print "**********************************************************" 
print "[xXx]" + "Remaining lottery numbers \n" + str(sorted(lottery_numbers, key=int))` 
+1

Это может быть лучше подходит для просмотра кода SE сайта –

ответ

1

Математически нет никакой разницы между назначая все номера для команды поддавки первым, или идти по круговой. По крайней мере, это правда, пока ваши номера выбираются наугад, что, кажется, они (если неэффективно). Поэтому вам не нужно ничего менять.

Но если вы все равно хотите что-то изменить, есть более элегантные способы, которыми вы можете это поделать. Во-первых, использование отдельных переменных для каждого человека в вашей лиге очень неудобно (вы должны использовать список!). Большим улучшением производительности было бы перетасовать список чисел только один раз, а затем принимать значения из него по порядку (вместо того, чтобы выбирать случайные элементы и их нужно удалять из середины списка).

Вот мой быстрый (минимально тестировался) попытка решить это, используя the roundrobin recipe from the itertools documentation:

from random import shuffle 
from itertools import repeat, cycle, islice 
from collections import OrderedDict, defaultdict 

def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 

lottery_numbers = ['1234','1235','1236','1237','1238','1239', 
'1245','1246','1247','1248','1249','1256','1257','1258','1259', 
'1267','1268','1269','1278','1279','1289','1345','1346','1347', 
'1348','1349','1356','1357','1358','1359','1367','1368','1369', 
'1378','1379','1389','1456','1457','1458','1459','1467','1468', 
'1469','1478','1479','1489','1567','1568','1569','1578','1579', 
'1589','1678','1679','1689','1789','2345','2346','2347','2348', 
'2349','2356','2357','2358','2359','2367','2368','2369','2378', 
'2379','2389','2456','2457','2458','2459','2467','2468','2469', 
'2478','2479','2489','2567','2568','2569','2578','2579','2589', 
'2678','2679','2689','2789','3456','3457','3458','3459','3467', 
'3468','3469','3478','3479','3489','3567','3568','3569','3578', 
'3579','3589','3678','3679','3689','3789','4567','4568','4569', 
'4578','4579','4589','4678','4679','4689','4789','5678','5679', 
'5689','5789','6789'] # this could probably be automatically generated 

def lotto(draws_dict): 
    results = defaultdict(list) 

    numbers = list(lottery_numbers) # copy 
    shuffle(numbers) # shuffles in place 
    num_iter = iter(numbers) 

    draw_sequence = roundrobin(*(repeat(player, count) 
           for player, count in draws_dict.items())) 

    for i, (player, numbers) in enumerate(zip(draw_sequence, num_iter)): 
     print("Draw #{}, for {}: {}".format(i+1, player, number)) 
     results[player].append(number) 

    print("\nFinal results:") 
    for player, draws in results.items(): 
     print("{}: {}".format(player, ", ".join(map(str, sorted(draws))))) 

    print("Unselected numbers: {}".format(", ".join(num_iter))) 

    return results 

if __name__ == "__main__": 
    num_draws = OrderedDict([('lori', 30), ('danny', 24), ('joon', 19), 
          ('alex', 15), ('abepat', 12), ('jonny', 10), 
          ('jung', 8), ('teho', 5), ('jess', 3)]) 
    results = lotto(num_draws) 
+0

Это неудобно, потому что я дал кому-то переменную «маленького любовника»? ха-ха. Спасибо за вход хороший сэр/мэм. Круглый робин из intertools выглядит законным для меня. – 0xa13x

+0

В основном проблема заключается в том, насколько конкретным является ваш код в ситуации. В моей версии вы можете легко добавить дополнительную команду, просто изменив «OrderedDict», который создается внизу. В вашем исходном коде вам нужно будет написать целую дополнительную ветвь логики и добавить кучу новых переменных. – Blckknght

0

Круговой не является необходимым для случайного выбора.
Вы действительно должны подумать о факторизации своего общего кода. Кроме того, вы можете рассмотреть другую структуру данных - а именно dict:

import random 
chances = [('lori', 30), ('danny', 24), ...] 
random.shuffle(lottery_numbers) 

lotto = {name: [lottery_numbers.pop() for _ in range(no_tickets)] for name, no_tickets in chances} 

for name, tickets in lotto.items(): 
    print("[+] {}'s lottery numbers are".format(name)) 
    print(' '.join(str(t) for t in sorted(tickets))) 
    print('****') 
print("[xXx] Remaining lottery numbers") 
print(' '.join(str(t) for t in sorted(lottery_tickets))) 

Выход:

[+] lori's lottery numbers are 
1237 1238 1259 1267 1269 1279 1345 1359 1378 1389 1458 1459 1789 2346 2347 2348 2378 2456 2458 2459 2468 2478 2489 3467 3469 3689 3789 4679 4789 5678 
**** 
[+] danny's lottery numbers are 
1236 1246 1278 1379 1479 1578 1589 1678 1689 2379 2467 2567 2678 2679 2789 3567 3569 3579 3589 3678 4568 4569 4578 5689 
... 
Смежные вопросы