2013-11-27 2 views
4

Я пишу короткую программу для своей баскетбольной команды. Я получил тренера, чтобы разделить игроков на списки, соответствующие конкретной позиции. (List1 = Point Guard)Как создать все возможные уникальные списки

Используя эти списки, я хочу создать вывод со всеми возможными «действительными» составами.

В настоящее время я написал основную программу, которая выбирает 5 уникальных людей из каждого списка

Как я могу вызвать это петлю таким образом, чтобы все «Правильная» конфигурация 5 игроков распечатанными?

Любые предложения или направления приветствуются!

Вот то, что я до сих пор:

import sys 
import random  

list1 = ['Gabe', 'taylor', 'kyle', 'jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 
FinalList = [] 


position_lists = [list1, list2, list3, list4, list5] 

for position_list in position_lists: # for every position 

    found_my_guy = False 

    while not found_my_guy: # keep looping till I find my guy 

     selectedPerson = position_list[ random.randint(0,len(position_list) -1) ] 

     if selectedPerson not in FinalList: # only append guys that are not duplicates 
      FinalList.append(selectedPerson) 
      found_my_guy = True # exit while loop and go to next `lineup' 


for person in FinalList: 
    sys.stdout.write(person + '\n') 
+0

Если у кого-либо есть предложения по последующему вопросу, посмотрите здесь: http: //stackoverflow.c om/questions/20234030/keep-only-unique-instance-of-lists-which-only-difference-is-order –

ответ

2
l = [(a,b,c,d,e) for a in list1 
        for b in list2 
         for c in list3 
          for d in list4 
           for e in list5 
            if len(set((a,b,c,d,e))) == 5] 
s = set(map(lambda e: tuple(sorted(e)), l)) 
print len(s) 

>>> 970 

EDIT: может быть, даже лучше

s = set([frozenset((a,b,c,d,e)) for a in list1 
       for b in list2 
        for c in list3 
         for d in list4 
          for e in list5 
           if len(set((a,b,c,d,e))) == 5]) 
print len(s) 

>>> 970 
+0

'a! = b! = c! = d! = e', не означает, что ae уникальны. Попробуйте '1! = 2! = 1'. (Это «Правда»). – korylprince

+0

Что мне делать с другим вопросом? Я не могу удалить его, потому что у него есть ответы –

+0

я использовал 'для модельного ряда в с: печати (модельный ряд)' Есть простой способ сделать распечатку всегда быть в порядке списков? –

1

использовать if s2 in FinalList, чтобы проверить, если s2 является aready определена FinalList,

4

Мы можем использовать itertools.product генерировать декартово произведение списков затем отфильтровать любые результаты, которые имеют дубликаты:

from itertools import product 

list1 = ['Gabe', 'Taylor', 'Kyle', 'Jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 

FinalList = [] 

for x in product(list1, list2, list3, list4, list5): 
    # check for duplicates 
    if len(set(x)) == 5 and set(x) not in FinalList: 
     FinalList.append(set(x)) 


# to print 
for x in FinalList: 
    print x 

есть более эффективные способы расчета такого списка я считаю, но этот код работает в основном Ins весело на моем скромном ноутбуке.

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

Edit: Кроме того, в качестве конечной ноты:

>>> len(FinalList) 
970 

(Этот список не может быть реальным полезным ...)

+0

Как распечатать содержимое финального списка? Я не уверен, как узнать, что что-то находится в python ... –

+0

См. Обновленный код для примера его печати по строкам. – korylprince

+0

Я считаю, что этот ответ неверен, один и тот же набор может появляться более одного раза –

1
playerLists = tuple(list1, list2, list3, list4, list5) 
masterSet = set(list1 + list2 + list3 + list4 + list5) 

from random import choice 
def FindPlayer(playerList): 
    while True: 
     randomPlayer = choice(playerList) 
     if randomPlayer in masterSet: 
      masterSet.remove(randomPlayer) 
      return randomPlayer 

for playerList in playerLists: 
    print FindPlayer(playerList) 
Смежные вопросы