Сортировка списка на основе значений из другого списка? - PullRequest
280 голосов
/ 08 июля 2011

У меня есть список таких строк:

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]

Какой самый короткий способ сортировки X с использованием значений из Y, чтобы получить следующий вывод?

["a", "d", "h", "b", "c", "e", "i", "f", "g"]

Порядок элементов, имеющих один и тот же «ключ», не имеет значения. Я могу прибегнуть к использованию for конструкций, но мне любопытно, если есть более короткий путь. Есть предложения?

Ответы [ 14 ]

1 голос
/ 26 марта 2018

Я создал более общую функцию, которая сортирует более двух списков на основе другого, вдохновленного ответом @ Whatang.

def parallel_sort(*lists):
    """
    Sorts the given lists, based on the first one.
    :param lists: lists to be sorted

    :return: a tuple containing the sorted lists
    """

    # Create the initially empty lists to later store the sorted items
    sorted_lists = tuple([] for _ in range(len(lists)))

    # Unpack the lists, sort them, zip them and iterate over them
    for t in sorted(zip(*lists)):
        # list items are now sorted based on the first list
        for i, item in enumerate(t):    # for each item...
            sorted_lists[i].append(item)  # ...store it in the appropriate list

    return sorted_lists
1 голос
/ 08 января 2018

Вы можете создать pandas Series, используя основной список как data, а другой список как index, а затем просто отсортировать по индексу:

import pandas as pd
pd.Series(data=X,index=Y).sort_index().tolist()

вывод:

['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']
0 голосов
/ 02 марта 2018

Вот ответ Whatangs, если вы хотите получить оба отсортированных списка (python3).

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]

Zx, Zy = zip(*[(x, y) for x, y in sorted(zip(Y, X))])

print(list(Zx))  # [0, 0, 0, 1, 1, 1, 1, 2, 2]
print(list(Zy))  # ['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']

Просто помните, что Zx и Zy - это кортежи. Я также брожу, если есть лучший способ сделать это.

Предупреждение: Если запустить его с пустыми списками, он вылетит.

0 голосов
/ 16 февраля 2018
list1 = ['a','b','c','d','e','f','g','h','i']
list2 = [0,1,1,0,1,2,2,0,1]

output=[]
cur_loclist = []

Чтобы получить уникальные значения, присутствующие в list2

list_set = set(list2)

Чтобы найти местоположение индекса в list2

list_str = ''.join(str(s) for s in list2)

Расположение индекса в list2 отслеживается с использованием cur_loclist

[0, 3, 7, 1, 2, 4, 8, 5, 6]

for i in list_set:
cur_loc = list_str.find(str(i))

while cur_loc >= 0:
    cur_loclist.append(cur_loc)
    cur_loc = list_str.find(str(i),cur_loc+1)

print(cur_loclist)

for i in range(0,len(cur_loclist)):
output.append(list1[cur_loclist[i]])
print(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...