假设我有一个包含8个对象的列表,编号为1-8。
这些对象被放入三个盒子中,3个在一个盒子中,3个在另一个盒子中,2个在最后一个盒子中。从数学上讲,有一些8C3*5C3=560方法可以做到这一点。我想遍历这560个项目。在Python中有没有这样做的方法?
结果应该如下所示:
list=['12','345',678'], ['12','346','578'], ..., etc.请注意,出于此目的,['12','345','678']和['12','354',876']被认为是相同的。
我想在这个列表中创建一个for循环。在Python中有没有这样做的方法?
这是我得到的解决方案,但它看起来很丑陋。
import itertools
for c1,c2 in itertools.combinations(range(8),2):
l2=list(range(8))
l2.pop(c2)
l2.pop(c1)
for c3,c4,c5 in itertools.combinations(l2,3):
l3=l2[:]
l3.remove(c5)
l3.remove(c4)
l3.remove(c3)
c6,c7,c8=l3
print(c1,c2,c3,c4,c5,c6,c7,c8)发布于 2013-05-02 13:58:42
def F(seq, parts, indexes=None, res=[], cur=0):
if indexes is None: # indexes to use for combinations
indexes = range(len(seq))
if cur >= len(parts): # base case
yield [[seq[i] for i in g] for g in res]
return
for x in combinations(indexes, r=parts[cur]):
set_x = set(x)
new_indexes = [i for i in indexes if i not in set_x]
for comb in F(seq, parts, new_indexes, res=res + [x], cur=cur + 1):
yield comb
it = F('12345678', parts=(2,3,3))
for i in range(10):
print [''.join(g) for g in next(it)]['12', '345', '678']
['12', '346', '578']
['12', '347', '568']
['12', '348', '567']
['12', '356', '478']
['12', '357', '468']
['12', '358', '467']
['12', '367', '458']
['12', '368', '457']
['12', '378', '456']另一个例子:
for c in F('1234', parts=(2,2)):
print [''.join(g) for g in c]['12', '34']
['13', '24']
['14', '23']
['23', '14']
['24', '13']
['34', '12']发布于 2013-05-02 14:08:32
你可以改变你所有的8个值(如前面的答案所示)。为此,请使用此previous answer (也可在以下代码中使用)。
然后将每个组合指定为一个元组,以便它们可以是散列的和唯一的,因此您必须对它们进行排序,以便它们也可以唯一地进行比较。
def all_perms(elements):
if len(elements) <=1:
yield elements
else:
for perm in all_perms(elements[1:]):
for i in range(len(elements)):
#nb elements[0:1] works in both string and list contexts
yield perm[:i] + elements[0:1] + perm[i:]
v = [1,2,3,4,5,6,7,8]
a = {}
for i in all_perms(v):
k = (tuple(sorted([i[0],i[1]])) , tuple(sorted([i[2],i[3],i[4]])) , tuple(sorted([i[5],i[6],i[7]])))
if k not in a:
a[k] = [str(i[0])+str(i[1]), str(i[2])+str(i[3])+str(i[4]), str(i[5])+str(i[6]) + str(i[7])]
x = 0
for i in a.values():
print x, i
x+=1对于8个值的示例,这给出了560个组合。
发布于 2013-05-02 13:24:08
L将是一个包含8个对象的列表,在本例中为字符串:
l = ["O1","02","03","04","04","06","07","08"]
for group in [l[:3],l[3:6],l[6:]]: #get 3 slices of the list into 3's and a 2
print(group)产生:
>>>
['O1', '02', '03']
['04', '04', '06']
['07','08']https://stackoverflow.com/questions/16330649
复制相似问题