我正在为我的篮球队写一个简短的节目。我已经让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')
答案 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)