我昨天问了一个问题,感谢蒂姆彼得斯,它已经解决了。问题就在这里;
新问题是这个问题的进一步版本。这次我将在元组内部生成元组。这是一个例子;
lis = [[(1,2), (3,4)], [(5,2), (1,2)], [(2,1), (1,2)]]
当我在 itertools.product 函数中使用它时,这就是我得到的,
((1, 2), (5, 2), (2, 1))
((1, 2), (5, 2), (1, 2))
((1, 2), (1, 2), (2, 1))
((1, 2), (1, 2), (1, 2))
((3, 4), (5, 2), (2, 1))
((3, 4), (5, 2), (1, 2))
((3, 4), (1, 2), (2, 1))
((3, 4), (1, 2), (1, 2))
我想改变它,如果一个序列里面有(a,b),那么它就不能有(b,a)。在这个例子中,如果你看一下这个序列((3, 4), (1, 2), (2, 1))
,它里面有 (1,2) 和 (2,1)。因此,((3, 4), (1, 2), (2, 1))
结果中不应考虑此序列。
正如我所说,我之前问过类似的问题,在这种情况下,它没有考虑重复的元素。我试着让它适应我的问题。这是修改后的代码。旧版本中的更改部分在评论中进行。
def reverse_seq(seq):
s = []
for i in range(len(seq)):
s.append(seq[-i-1])
return tuple(s)
def uprod(*seqs):
def inner(i):
if i == n:
yield tuple(result)
return
for elt in sets[i] - reverse:
#seen.add(elt)
rvrs = reverse_seq(elt)
reverse.add(rvrs)
result[i] = elt
for t in inner(i+1):
yield t
#seen.remove(elt)
reverse.remove(rvrs)
sets = [set(seq) for seq in seqs]
n = len(sets)
#seen = set()
reverse = set()
result = [None] * n
for t in inner(0):
yield t
在我看来,这段代码应该可以工作,但我收到输入错误lis = [[(1,2), (3,4)], [(5,2), (1,2)], [(2,1), (1,2)]]
。我不明白我错在哪里。
for i in uprod(*lis):
print i
输出是,
((1, 2), (1, 2), (1, 2))
Traceback (most recent call last):
File "D:\Users\SUUSER\workspace tree\sequence_covering _array\denemeler_buraya.py", line 39, in <module>
for i in uprod(*lis):
File "D:\Users\SUUSER\workspace tree\sequence_covering _array\denemeler_buraya.py", line 32, in uprod
for t in inner(0):
File "D:\Users\SUUSER\workspace tree\sequence_covering _array\denemeler_buraya.py", line 22, in inner
for t in inner(i+1):
File "D:\Users\SUUSER\workspace tree\sequence_covering _array\denemeler_buraya.py", line 25, in inner
reverse.remove(rvrs)
KeyError: (2, 1)
谢谢,