与其他人提到的一样,代码有太多问题。我会试着解释我将如何实现这个功能。
这听起来像你想要做的事实际上是这样的:你从输入序列中产生一个对列表,并查看这些对之间是否有重复。当你制定这样的问题时,实施起来会更容易。
首先我们需要生成对。它可以通过多种方式来完成,你可能会做的一个是:
def pairs(seq):
ret = []
# go to the 2nd last item of seq
for k in range(len(seq)-1):
# append a pair
ret.append((seq[k], seq[k+1]))
return ret
现在,我们希望看到(A,B)和(B,A)和相同的元组,所以我们简单的元组进行排序:
def sorted_pairs(seq):
ret = []
for k in range(len(seq)-1):
x,y = (seq[k], seq[k+1])
if x <= y:
ret.append((x,y))
else:
ret.append((y,x))
return ret
现在解决这个问题非常简单。我们只需要生成所有这些元组并将它们添加到集合中。一旦我们看到一对两次我们正在这样做:
def has_common_pairs(*seqs):
""" checks if there are any common pairs among any of the seqs """
# store all the pairs we've seen
seen = set()
for seq in seqs:
# generate pairs for each seq in seqs
pair_seq = sorted_pairs(seq)
for pair in pair_seq:
# have we seen the pair before?
if pair in seen:
return True
seen.add(pair)
return False
现在你想实现的功能是相当简单:
def check(xxr):
return not has_common_pairs(*xxr)
PS:可以概括sorted_pairs的函数,在任何类型的工作可迭代的,不仅仅是那些支持索引的。为了完整起见,我将在下面粘贴它,但您并不需要它,它很难理解:
def sorted_pairs(seq):
""" yield pairs (fst, snd) generated from seq
where fst <= snd for all fst, snd"""
it = iter(seq)
fst = next(it)
for snd in it:
if first <= snd:
yield fst, snd
else:
yield snd, fst
first = snd
您仍然困惑元组和列表。另外,“似乎没有正确的工作”是一个100%无价值的错误报告 - 你得到了什么结果,你期望什么? – delnan 2010-12-12 14:30:53
@delnan我认为预期的结果是在文档字符串中描述的,但我同意“仍然令人困惑的列表/元组”:) – khachik 2010-12-12 14:45:59
如果函数会查找常见对(如果对意味着你'期望,即'对([1,2,3,4]) - > [(1,2),(2,3),(3,4)]'),那么就不会有'排序'那里。看看'[1,2,3,4]和[1,3,5,2]' – 2010-12-12 15:05:56