挑战是编写一个函数来比较两个相当小的整数列表(每个大小少于10个元素)。 一个列表可能是这样的:
self = [0, 0, 1, 2]
要与之比较的列表可能类似于以下示例之一:
other1 = []
other2 = [0, 0, 1]
other3 = [0, 0, 1, 2, 0]
other4 = [0, 1, 1, 2]
other5 = something
如您所见,重复元素非常常见,元素的顺序很重要。
预期结果应该是一个整数,表示从一开始算起的自我和其他相同的时间。因此,取决于其他,结果将是:
result1 = 0
result2 = 3
result3 = 4
result4 = 1
result5 = 0
代码应该是最有效的,因为每次用户交互都需要使用100次。
我编写了以下代码,它按预期工作,但似乎有点慢:
def match(self, other):
if self == other:
return len(self)
element = -1
for element in range(min(len(self), len(other))):
if self[element] != other[element]:
element -= 1
break
return element +1
第一个if语句已经是一个增强速度,但是解决方案似乎仍然很慢,并且对变量named元素和两个return语句的所有更正看起来都有些笨拙。
是否有人为这样一个比'match'或'compare'更好的函数命名?
答案 0 :(得分:4)
>>> from itertools import takewhile, izip
>>> def F(seq1, seq2):
return sum(1 for x in takewhile(lambda x: x[0] == x[1], izip(seq1, seq2)))
>>> F([0, 0, 1, 2], [0, 0, 1, 2, 0])
4
答案 1 :(得分:1)
在related question中,我发布了以下可能的解决方案:
def while_equal(seq, other):
for this, that in zip(seq, other):
if this != that:
return
yield this
def match(seq, other):
return sum(1 for _ in while_equal(seq, other))
和
def match_loop(seq, other):
count = 0
for this, that in zip(seq, other):
if this != that:
return count
count += 1
return count
这些版本都比其他给定的解决方案更快(第二个是最快的),我认为,更具可读性。
答案 2 :(得分:0)
编辑:正如jamylak指出的,我的解决方案是错误的。我会把它放在这里,所以每个想回答这个问题的人都会看到整个问题,而不仅仅是前两个案例。
另一种不需要itertools
的解决方案,虽然它不如jamylak's solution那么有效。
def compareLists(list1, list2):
return sum(map(lambda (x,y): 1 if x == y else 0, zip(list1, list2)))