如何创建所有可能的唯一列表

时间:2013-11-27 03:31:53

标签: python loops python-2.7 unique

我正在为我的篮球队写一个简短的节目。我已经让Coach将球员分成对应于特定位置的列表。 (List1 = Point Guards)

使用这些列表,我想创建一个包含所有可能“有效”阵容的输出。

目前,我编写了一个基本程序,从每个列表中选择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')

4 个答案:

答案 0 :(得分: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

我相信有更有效的方法来计算这样的列表,但是这个代码基本上立即在我的笔记本电脑上运行。

另外,为了解决你的第二个问题,基本上你是以错误的方式做到了。理论上,随机猜测可以让你创建所有可能的名称集,但只有你接近无穷大。在实践中,它当然会更快,但仍然比直接生成列表效率低得多。

编辑:另外,作为最后一点:

>>> len(FinalList)
970

(此列表可能不太有用......)

答案 1 :(得分: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

编辑:可能更好

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

答案 2 :(得分:1)

使用if s2 in FinalList检查s2是否已在Finalist中被选中,

答案 3 :(得分: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)