bearophileh...@lycos.com writes: > You can also use quite less code, but this is less efficient: > > def equal_items(iter1, iter2, key=lambda x: x): > class Guard(object): pass > try: > for x, y in izip_longest(iter1, iter2, fillvalue=Guard()): > if key(x) != key(y): > return False > except TypeError: # intercepts key(guard) > return False > return True
You don't want to silence TypeErrors that may arise from with key() when x or y is not a Guard, as it could hide bugs in key(). So I would write something like this: def equal_items(iter1, iter2, key=lambda x: x, _fill = object()): for x, y in izip_longest(iter1, iter2, fillvalue=_fill): if x is _fill or y is _fill or key(x) != key(y): return False return True (untested) Another way would be: def equal_items(iter1, iter2, key=lambda x: x): iter1, iter2 = iter(iter1), iter(iter2) for x, y in izip(iter1, iter2): if key(x) != key(y): return False for x, y in izip_longest(iter1, iter2): return False return True (untested) -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list