Сортировка пар в списке разных размеров - PullRequest
0 голосов
/ 04 октября 2018

У меня есть список с элементами различного размера (некоторые даже пустые), заданный как:

a1 = [array([[83, 84]]), array([[21, 24], [32, 53],[54, 56]]), array([[21,24],[32, 37],[45, 46]]), [], []]

В этом списке значения либо в парах (в массивах), либопросто пусто.Все, что я хочу сделать, это отсортировать все пары в порядке убывания на основе их различий и сохранить их местоположение / индекс в исходном списке (т.е. a1).Например, мой желаемый вывод:

a1_sorted = [[32,53],[32,37],[21,24],[21,24],[54,56],[45,46],[83,84],[],[]] a1_index = [[1,1],[2,1],[1,0],[2,0],[1,2],[2,2],[0,0],[3,0],[4,0]]

Поскольку пустые элементы не имеют 2D-местоположения, ниже, указывающий только первый индекс элемента, также являетсяподходящая альтернатива:

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

Мой первоначальный подход заключался в простой итерации по элементам списка, но обработка пустых элементов и переменных размеров измерений замедлила эту работу.Есть мысли об оптимальных решениях?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

вы можете попробовать этот код.Однако не удалось получить пустые списки

import numpy as np
import pandas as pd

# the data
a1 =  [np.array([[83, 84]]), np.array([[21, 24], [32, 53],[54, 56]]), 
       np.array([[21,24],[32, 37],[45, 46]]), np.array([]), 
       np.array([])]

# create a data frame to store data in
df = pd.DataFrame(columns=['pair', 'index', 'difference']) 

for j, item in enumerate(a1): 
    a = item.ravel() # convert 2d array to 1d array
    for i in range(len(a)//2):
        difference = a[i*2+1] - a[i*2]
        pair = [a[i*2], a[i*2+1]]
        index = [j, np.where(np.all(item==pair,axis=1))[0]]

        df.loc[len(df)] = [pair, index, difference]

df.sort_values(by='difference', ascending=False, inplace=True) # sort based on diff

print(df)

       pair     index difference
2  [32, 53]  [1, [1]]         21
5  [32, 37]  [2, [1]]          5
1  [21, 24]  [1, [0]]          3
4  [21, 24]  [2, [0]]          3
3  [54, 56]  [1, [2]]          2
0  [83, 84]  [0, [0]]          1
6  [45, 46]  [2, [2]]          1

a1_sorted =  df['pair'].tolist()
print(a1_sorted)

[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46]]
0 голосов
/ 04 октября 2018

Вы можете использовать enumerate для генерации индексов для списков и подсписков, затем использовать понимание списков для создания пар, связанных с их индексами, в качестве кортежей, которые будут отсортированы вместе для вывода, и при необходимости распаковать по двум различным переменным:

a1_sorted, a1_index = zip(*sorted(((t, [i, j])
                      for i, l in enumerate(a1) for j, t in enumerate(list(l) or [[]])),
                      key=lambda t: -abs(t[0][1] - t[0][0]) if len(t[0]) else 0))

a1_sorted станет:

[[32, 53], [32, 37], [21, 24], [21, 24], [54, 56], [83, 84], [45, 46], [], []]

a1_index станет:

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