Сортировать список по алфавиту и получить начальный индекс в python - PullRequest
0 голосов
/ 30 апреля 2020

Я пытался отсортировать список имен по алфавиту, скажем:

list=['Bob','Alice','Charlie']
print(list.index('Alice'))
1

Однако я также хотел бы отслеживать исходные индексы, так что это не сработает:

list.sort()
print(list)
['Alice','Bob','Charlie']
print(list.index('Alice'))
0

После сортировки индексы изменились; Есть ли способ отслеживать исходные индексы? Я проверил другие подобные вопросы и numpy имеет решение, но бесполезно для переменных str.

Ответы [ 6 ]

5 голосов
/ 30 апреля 2020

Просто сортируйте перевернутые (index, name) кортежи из enumerate, чтобы отслеживать элементы и их индексы:

>>> names = ['Bob','Alice','Charlie']
>>> sorted((name, index) for index, name in enumerate(names))
[('Alice', 1), ('Bob', 0), ('Charlie', 2)]
4 голосов
/ 30 апреля 2020
l = ['Bob','Alice','Charlie']
e = enumerate(l) # creates a generator of [(0, 'Bob'), (1, 'Alice'), (2, 'Charlie')]
sl = sorted(e, key=lambda x: x[1]) # [(1, 'Alice'), (0, 'Bob'), (2, 'Charlie')]
3 голосов
/ 30 апреля 2020

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

>>> a = ['Bob', 'Alice', 'Charlie']
>>> idx = range(len(a))
>>> idx
[0, 1, 2]
>>> sorted( idx, key=lambda x : a[x] )
[1, 0, 2]
>>> 
1 голос
/ 30 апреля 2020

Вы можете создать своего рода вложенный словарь для хранения исходного индекса и отсортированного значения.

Сначала я бы рекомендовал использовать правильное имя для вашего объекта списка, список - это ключевое слово в python.

names=['Bob','Alice','Charlie']

name_dict = {name : {'unsorted' : idx} for idx,name in enumerate(names)}

for sorted_idx, name in enumerate(sorted(names)):
    name_dict[name].update({'sorted' : sorted_idx})

print(name_dict['Bob']['sorted'])
1
print(name_dict['Bob']['unsorted'])
0

print(name_dict)

{'Bob': {'unsorted': 0, 'sorted': 1},
 'Alice': {'unsorted': 1, 'sorted': 0},
 'Charlie': {'unsorted': 2, 'sorted': 2}}
0 голосов
/ 30 апреля 2020

Да, вы можете отслеживать начальный индекс, но с другой структурой данных

a = ['Bob','Alice','Charlie']
l = sorted(enumerate(a), key=lambda i: i[1])
print(l)

Теперь отсортированный список, который отслеживает начальный индекс,

[(1, 'Alice'), (0, 'Bob'), (2, 'Charlie')]
0 голосов
/ 30 апреля 2020

Сортировка списка по алфавиту и получение начального индекса в python

l=['Bob','Alice','Charlie']
def sort_and_get_first_element(list1):
    list1.sort()
    return list1[0]
print sort_and_get_first_element(l)
...