如果我從你的問題,你的意見理解是正確的,下面的功能應該給你正確的輸出/打印和應該等於你預計你的問題是什麼。
這裏是我的解決方案
from itertools import groupby
from random import randint
a_list = [('a', {'x'}), ('b', {'y'}), ('c', {'y','z'}), ('d', {'y','z'}), ('e', {'x','y'}), ('f', {'x','y','z'})]
pattern = {'x', 'y'}
def seq_gen(a = [], pattern = set, draws = 0):
single, multi = [], []
for i in a:
if len(i[1]) == 1:
single.append(i)
else:
multi.append(i)
final = [j for j in single if list(pattern)[0] in j[1] or list(pattern)[1] in j[1]]
final += [j for j in multi if pattern == j[1]]
# Debug
#print(final)
if draws == 1:
for i in final:
if len(i[1]) == 2:
# for better use, return a list not a tuple
return "draw(1) => {0}".format([i])
if draws > len(final):
k, f = list(), tuple()
for _, v in groupby(a, lambda x: x[1]):
# Debug
#print(list(v))
k += list(v)[0]
return "draw({0}) => {1}".format(draws, [tuple(k[x:x+2]) for x in range(0,len(k), 2)])
if draws == len(final):
return "draw({0}) => {1}".format(draws, final)
else:
aa = []
while len(aa) != 2:
element = final[randint(0, len(final) -1)]
if element not in aa:
aa.append(element)
return "draw({0}) => {1}".format(draws, aa)
for i in range(1,8):
print(seq_gen(a_list, pattern, i))
輸出:
draw(1) => [('e', {'x', 'y'})]
draw(2) => [('e', {'x', 'y'}), ('a', {'x'})]
draw(3) => [('a', {'x'}), ('b', {'y'}), ('e', {'x', 'y'})]
draw(4) => [('a', {'x'}), ('b', {'y'}), ('c', {'z', 'y'}), ('e', {'x', 'y'}), ('f', {'x', 'z', 'y'})]
draw(5) => [('a', {'x'}), ('b', {'y'}), ('c', {'z', 'y'}), ('e', {'x', 'y'}), ('f', {'x', 'z', 'y'})]
draw(6) => [('a', {'x'}), ('b', {'y'}), ('c', {'z', 'y'}), ('e', {'x', 'y'}), ('f', {'x', 'z', 'y'})]
draw(7) => [('a', {'x'}), ('b', {'y'}), ('c', {'z', 'y'}), ('e', {'x', 'y'}), ('f', {'x', 'z', 'y'})]
PS:不要猶豫,來回報您的反饋。如果有什麼問題,我會嘗試用新的查詢來修復它。
'overhead'和'draw'是什麼意思?是'draw'的*期望的數量{x,y}必須在最終集合中? – TuanDT
「draw」是a_list中的一個元素被獲取並根據該模式進行評估的次數。 – Raggamuffin
我刪除了開銷,這使思想複雜化。開銷我的意思是,當我從列表中選取7個項目,並且模式有2個項目時,理想情況下該模式適合3次,最後一個繪製只適合該模式的一部分。那部分我打電話開銷。 – Raggamuffin