def merge_sort(values, key=lambda x: x):
    if len(values) <= 1:
        return list(values)
    mid = len(values) // 2
    left = merge_sort(values[:mid], key)
    right = merge_sort(values[mid:], key)
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if key(left[i]) <= key(right[j]):
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result


if __name__ == '__main__':
    print(merge_sort([(2, 'a'), (1, 'x'), (2, 'b')], key=lambda row: row[0]))
