Python, как перемешать упорядоченный список, чтобы сделать последовательности элементов? - PullRequest
0 голосов
/ 23 июня 2019

Например, у нас есть упорядоченный список:

a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

Я хочу перестановить этот массив в форму:

a = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

В настоящее время я делаю:

a = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
n_unique_elements = 4
arrays_with_same_elements = np.array_split(a, 5)

for idx in range(n_unique_elements):
    final_list.append(list_similar_a[0][idx])
    final_list.append(list_similar_a[1][idx])
    final_list.append(list_similar_a[2][idx])
    final_list.append(list_similar_a[3][idx])
    final_list.append(list_similar_a[4][idx])

Итак, переменная

final_list = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4] 

Должен быть pythonic способ сделать это. Возможно встроенная функция в numpy? Какие еще техники приходят на ум, чтобы решить эту проблему?

Ответы [ 5 ]

1 голос
/ 23 июня 2019

Попробуйте: (чистый питон без внешней библиотеки)

STEP = 3
lst0 = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
lst1 = []

for x in range(0, STEP):
    for y in range(0, len(lst0), STEP):
        lst1.append(lst0[y + x])
print(lst1)

выход

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
1 голос
/ 23 июня 2019

Итак, вы можете использовать numpy:

a.reshape([4,3]).T.flatten()

поэтому .reshape() помещает его в прямоугольный мартикс, .T переключает строки и столбцы, а .flatten() снова помещает его в линейный вектор

теперь вам нужно только придумать параметры для изменения формы, например, .reshape([step, repetition])

1 голос
/ 23 июня 2019

Вы можете использовать параметр ключа в методе sort (): https://docs.python.org/3.3/howto/sorting.html#key-functions или используя set ()

a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
b = set(a)
final_list = list(b) * len(b)
0 голосов
/ 23 июня 2019

Попробуйте это:

    a = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
    uniqueValues, occurCount = np.unique(a, return_counts=True) # uniqueValues is the array of unique elements of main list
                                                                #occurCount is array containing frequency of unique elements
    common_occur=min(occurCount)                                # get frequency of co-occurrance

    final_array=np.tile(uniqueValues,common_occur)              #get tiled output array
0 голосов
/ 23 июня 2019

Если частота каждого элемента одинакова и известна заранее, это решение также будет работать

FREQ = 3
output = a[::FREQ] * (len(a) // FREQ)

Другое решение на основе numpy это:

FREQ = 3
output = a.reshape((-1, FREQ)).flatten(order='F')

Аргумент order='F' выравнивает матрицу по столбцам.

...