def sorted_items(items, key=None, max_items_in_memory=None, tempdir=None): if max_items_in_memory: grouped_items = group_in_packets(items, max_items_in_memory) else: grouped_items = [items] # sort and write to disk all groups but the last one write_to_disk = True if max_items_in_memory else False sorted_groups = [] for group in grouped_items: sorted_group = sorted(group, key=key) del group if write_to_disk: group_fhand = _pickle_items(sorted_group, tempdir=tempdir) sorted_groups.append(_unpickle_items(open(group_fhand.name))) else: sorted_groups.append(sorted_group) del sorted_group if len(sorted_groups) > 1: if key is None: sorted_items = merge_sorted(*sorted_groups) else: sorted_items = merge_sorted(*sorted_groups, key=key) else: sorted_items = sorted_groups[0] return sorted_items
def test_merge_sorted(): assert list(merge_sorted([1, 2, 3], [1, 2, 3])) == [1, 1, 2, 2, 3, 3] assert list(merge_sorted([1, 3, 5], [2, 4, 6])) == [1, 2, 3, 4, 5, 6] assert list(merge_sorted([1], [2, 4], [3], [])) == [1, 2, 3, 4] assert list(merge_sorted([5, 3, 1], [6, 4, 3], [], key=lambda x: -x)) == [6, 5, 4, 3, 3, 1] assert list(merge_sorted([2, 1, 3], [1, 2, 3], key=lambda x: x // 3)) == [2, 1, 1, 2, 3, 3] assert list(merge_sorted([2, 3], [1, 3], key=lambda x: x // 3)) == [2, 1, 3, 3] assert "".join(merge_sorted("abc", "abc", "abc")) == "aaabbbccc" assert "".join(merge_sorted("abc", "abc", "abc", key=ord)) == "aaabbbccc" assert "".join(merge_sorted("cba", "cba", "cba", key=lambda x: -ord(x))) == "cccbbbaaa"
def test_merge_sorted(): assert list(merge_sorted([1, 2, 3], [1, 2, 3])) == [1, 1, 2, 2, 3, 3] assert list(merge_sorted([1, 3, 5], [2, 4, 6])) == [1, 2, 3, 4, 5, 6] assert list(merge_sorted([1], [2, 4], [3], [])) == [1, 2, 3, 4] assert list(merge_sorted([5, 3, 1], [6, 4, 3], [], key=lambda x: -x)) == [6, 5, 4, 3, 3, 1] assert list(merge_sorted([2, 1, 3], [1, 2, 3], key=lambda x: x // 3)) == [2, 1, 1, 2, 3, 3] assert list(merge_sorted([2, 3], [1, 3], key=lambda x: x // 3)) == [2, 1, 3, 3] assert ''.join(merge_sorted('abc', 'abc', 'abc')) == 'aaabbbccc' assert ''.join(merge_sorted('abc', 'abc', 'abc', key=ord)) == 'aaabbbccc' assert ''.join(merge_sorted('cba', 'cba', 'cba', key=lambda x: -ord(x))) == 'cccbbbaaa'
def test_merge_sorted(): assert list(merge_sorted([1, 2, 3], [1, 2, 3])) == [1, 1, 2, 2, 3, 3] assert list(merge_sorted([1, 3, 5], [2, 4, 6])) == [1, 2, 3, 4, 5, 6] assert list(merge_sorted([1], [2, 4], [3], [])) == [1, 2, 3, 4]