2013-12-08 3 views
3

Если у меня есть список, и я хочу продолжать добавлять строки к нему и сортировать их по алфавиту по их фамилии, как это можно сделать? Сортировка только, кажется, переупорядочивает их первой буквой строки.Как отсортировать список по алфавиту по второму слову в строке

line = "James Edward" #Example line 
    linesList.append("".join(line)) #Add it to a list 
    linesList = sorted(linesList) #Sort alphabetically 

ответ

0

Предполагая, что имена в формате FirstName<whitespace>LastName, вы можете использовать параметр key из sorted:

>>> lst = ['Bob D', 'Bob A', 'Bob C', 'Bob B'] 
>>> lst = sorted(lst, key=lambda x: x.split()[1]) 
>>> lst 
['Bob A', 'Bob B', 'Bob C', 'Bob D'] 
>>> 

Тот же принцип применяется до list.sort:

>>> lst = ['Bob D', 'Bob A', 'Bob C', 'Bob B'] 
>>> lst.sort(key=lambda x: x.split()[1]) 
>>> lst 
['Bob A', 'Bob B', 'Bob C', 'Bob D'] 
>>> 

Кроме того, если вы хотите их, вот ссылка на lambda и один на str.split.

2

Если вы хотите полностью корректную алфавитность (отсортированную по имени, когда фамилия совпадает), вы можете воспользоваться тем, что сортировка Python стабильна. Если вы первый сортировать по ключу по умолчанию:

lst.sort() 

, а затем сортировать по фамилии:

lst.sort(key=lambda n: n.split()[1]) 

затем записи с той же фамилией будет заводиться в том же порядке, что первый sort положить их в - что будет правильно.

Вы также можете сделать это все сразу с sorted:

linesList = sorted(sorted(linesList), key=lambda n: n.split()[1]) 
0

В случае, если у вас есть three или n имена, и вы хотите отсортировать его всегда по последней части имени, которое вы можете сделать:

names = ["John Mc Karter", "John Oliver", "Max Raiden", "Naruto Ho Uzumaki"] 
print(names.sort(key=lambda x:x.split()[-1])) 
>>>['John Mc Karter', 'John Oliver', 'Max Raiden', 'Naruto Ho Uzumaki'] 
Смежные вопросы