Изменить или получить новый объект массива
Уважаемые Коллеги. Получаю массив следующего вида:
arr = [
[0, 0, list(['0', '1', '2', '3', '4', '5', '6', '7', '9', '11', '21', '22', '23'])],
[1, 1, list(['0', '1', '2', '3', '4', '5', '6', '7', '21', '22', '23'])],
[2, 2, list(['1', '2', '3', '4', '5', '6', '7', '21', '23'])],
[1382, 1387, list(['4'])],
[1388, 1399, list(['3', '4'])],
[1400, 1420, list(['3', '4', '5'])],
[1421, 1458, list(['2', '3', '4', '5'])],
[1459, 1468, list(['2', '3', '4'])],
[1469, 1486, list(['2', '4'])],
[1487, 1487, list(['4'])],
[3473, 3475, list(['7', '8', '9'])],
[3479, 3479, list(['7', '9'])],
[3487, 3488, list(['2'])],
[3489, 3489, list(['0', '2'])],
[3490, 3490, list(['0', '2', '4', '6'])],
[3491, 3491, list(['0', '2', '4', '6', '11'])],
[3492, 3492, list(['0', '1', '2', '4', '6', '11', '23'])],
[3493, 3493, list(['0', '1', '2', '3', '4', '6', '11', '16', '23'])],
[3494, 3495, list(['0', '1', '2', '3', '4', '5', '6', '11', '16', '23'])]
]
Значения в первых двух колонках возрастают. Количество строк массива почти всегда разное. Необходимо отсортировать его таким образом, чтобы привести к виду:
anomalia = [
[0, 2, ['0', '1', '2', '3', '4', '5', '6', '7', '9', '11', '21', '22', '23']],
[1382, 1487, ['2', '3', '4', '5']],
[3473, 3479, ['7', '8', '9']],
[3487, 3495, ['0', '1', '2', '3', '4', '5', '6', '11', '16', '23']]
]
В общем, из массива arr нужно получить массив anomalia. Необходимо сравнить все строки массива(списки) между собой, которые состоят из трех элементов, где третий элемент - это вложенный список, первые два - числа типа int. Если, допустим, сравнивать между собой две строки, то второй элемент первой строки должен отличаться от первого элемента второй строки ровно на 1(т.е. построчное возрастание между вторым элементом первой строки и первым элементом второй строки должно быть 1). Параллельно сравнить третьи элементы этих двух строк. Необходимо выбрать из этих двух строк больший третий элемент(вложенный список) и он должен содержать в себе элементы меньшего вложенного списка другой строки. Если нарушается данное условие, то в anomalia добавляется список, где первый элемент - это значение начала проверки, второй элемент - конечное значение, при котором условие проверки нарушается, и третий элемент - список с максимальной длинной из проверенных, в котором присутствуют все значения меньших просмотренных списков. Также надо учитывать возможное равенство первого и второго элементов в просматриваемой строке.
В настоящем дошел до следующего:
anomalia = []
def change_arr(ar, ind):
''' проверка вхождения в множество '''
if ar[ind][2] > ar[ind + 1][2]:
if set(ar[ind][2]) >= set(ar[ind + 1][2]):
return # ?
elif ar[ind + 1][2] > ar[ind][2]:
if set(ar[ind + 1][2]) >= set(ar[ind][2]):
return # ?
for index, j in enumerate(arr):
if arr[index][0] == arr[index][1] and arr[index + 1][0] == arr[index + 1][1]:
if arr[index][0] < arr[index + 1][0] and (int(arr[index + 1][0]) - int(arr[index][0]) == 1):
change_arr(arr, index)
else:
pass # ?
elif arr[index][0] == arr[index][1] and arr[index + 1][0] < arr[index + 1][1]:
if arr[index][1] < arr[index + 1][0] and (int(arr[index + 1][0]) - int(arr[index][1]) == 1):
change_arr(arr, index)
else:
pass # ?
elif arr[index][0] < arr[index][1] and arr[index + 1][0] < arr[index + 1][1]:
if arr[index][1] < arr[index + 1][0] and (int(arr[index + 1][0]) - int(arr[index][1]) == 1):
change_arr(arr, index)
else:
pass # ?
elif arr[index][0] < arr[index][1] and arr[index + 1][0] == arr[index + 1][1]:
if arr[index][1] < arr[index + 1][0] and (int(arr[index + 1][0]) - int(arr[index][1]) == 1):
change_arr(arr, index)
else:
pass # ?