Нахождение и группировка последовательности +1 чисел python - PullRequest
0 голосов
/ 14 февраля 2020

Я хотел бы распознать последовательности в этом массиве, но все мои идеи очень неэффективны:

np.array([ 27,  28,  29,  30,  31,  38,  39,  40,  43,  44,  45,  46,  57,
             58,  59,  74,  85,  87,  88,  89,  90,  95,  96,  97, 166, 182,
            183, 265, 269, 271, 272, 279, 280, 281, 282, 288, 326, 327, 328,
            356, 387, 399, 407, 408, 437, 438, 439, 453, 454, 455, 456, 457,
            480, 489, 537, 538, 673, 674, 676, 677, 682, 687, 704, 729, 730,
            732, 733, 745, 746, 747, 748],
           dtype='int64')

Я ожидаю получить массив [27,28,29,30,31] как группу ' A 'или группа' 1 '; 31 как группа «B» или 2; [38,39,40] как группа 3 или 'C', и т. Д. c.

Знаете ли вы какую-либо библиотеку, которая делает это, или какой-нибудь "эффективный" способ сделать это?

1 Ответ

0 голосов
/ 14 февраля 2020
#!/usr/bin/env python3

array = [ 
      27,  28,  29,  30,  31,  38,  39,  40,  43,  44,  45,  46,  57,
      58,  59,  74,  85,  87,  88,  89,  90,  95,  96,  97, 166, 182,
      183, 265, 269, 271, 272, 279, 280, 281, 282, 288, 326, 327, 328,
      356, 387, 399, 407, 408, 437, 438, 439, 453, 454, 455, 456, 457,
      480, 489, 537, 538, 673, 674, 676, 677, 682, 687, 704, 729, 730,
      732, 733, 745, 746, 747, 748
]


def groupByDistance(distance, array):
    index_key = 65 # Like 'A'
    index = 0
    ret = {}
    found = []
    array.append(min(array)-1) # To be sure that there isnt yet in

    while index < len(array)-1:
        if array[index]+distance == array[index+1]:
            found.append(array[index])
        else:
            found.append(array[index])
            ret[chr(index_key)] = found
            index_key+=1
            if index_key >= 91 and index_key <= 96:
                index_key = 97 # Go to 'a' but it can overlap...
            found = []

        index+=1

    return ret

res = groupByDistance(1, array)

for _ in res:
    print(_, " : ", res[_])

Это просто подсказка. Обратите внимание, что для большого массива символов ascii недостаточно, используйте вместо этого что-то другое, например модуль пунктуации строки. Очевидно, что возвращенный dict не в порядке, но вы можете легко предоставить функцию для переупорядочения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...