def test_key(self): """Test using a custom `key` function.""" iterables = [xrange(5, 0, -1), xrange(4, 0, -1)] eq_(list(sorted(reduce(list.__add__, [list(it) for it in iterables]), reverse=True)), list(collate(*iterables, key=lambda x: -x)))
def retourne(self, ressources_rendues): """ remet les plages de ressources donnees dans le systeme. EN: Returns back resources taken by function reserve, saved in the argument. """ ressources = collate(self.intervalles, ressources_rendues.intervalles) #print(ressources) intervalles = [] intervalles.append(next(ressources)) #print(intervalles) for intervalle in ressources: if intervalles[-1][1] == intervalle[0]: intervalles[-1][1] = intervalle[1] else: intervalles.append(intervalle) self.intervalles = intervalles
def duplicates(*iterables, **kwargs): """ Yield duplicate items from any number of sorted iterables of items >>> items_a = [1, 2, 3] >>> items_b = [0, 3, 4, 5, 6] >>> list(duplicates(items_a, items_b)) [(3, 3)] It won't behave as you expect if the iterables aren't ordered >>> items_b.append(1) >>> list(duplicates(items_a, items_b)) [(3, 3)] >>> list(duplicates(items_a, sorted(items_b))) [(1, 1), (3, 3)] This function is most interesting when it's operating on a key of more complex objects. >>> items_a = [dict(email='*****@*****.**', id=1)] >>> items_b = [dict(email='*****@*****.**', id=2), dict(email='other')] >>> dupe, = duplicates(items_a, items_b, key=operator.itemgetter('email')) >>> dupe[0]['email'] == dupe[1]['email'] == '*****@*****.**' True >>> dupe[0]['id'] 1 >>> dupe[1]['id'] 2 """ key = kwargs.pop('key', lambda x: x) assert not kwargs zipped = more_itertools.collate(*iterables, key=key) grouped = itertools.groupby(zipped, key=key) groups = ( tuple(g) for k, g in grouped ) def has_dupes(group): return len(group) > 1 return filter(has_dupes, groups)
def test_reverse(self): """Test the `reverse` kwarg.""" iterables = [xrange(4, 0, -1), xrange(7, 0, -1), xrange(3, 6, -1)] eq_(sorted(reduce(list.__add__, [list(it) for it in iterables]), reverse=True), list(collate(*iterables, reverse=True)))
def test_one(self): """Work when only 1 iterable is passed.""" eq_([0, 1], list(collate(xrange(2))))
def test_empty(self): """Be nice if passed an empty list of iterables.""" eq_([], list(collate()))
def test_default(self): """Test with the default `key` function.""" iterables = [xrange(4), xrange(7), xrange(3, 6)] eq_(sorted(reduce(list.__add__, [list(it) for it in iterables])), list(collate(*iterables)))