2013-03-26 2 views
3

Например я бы список изPythonic способ сортировки списка

lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35'] 

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

lists.sort() = ['ben 10', 'jack 20', 'ollie 35', 'alisdar 50'] 

Возможно каким-то образом использовать форматирование с Трещина()?

ответ

13

Используйте key функцию:

lists.sort(key=lambda s: int(s.rsplit(None, 1)[-1])) 

key вызываемым передается каждый элемент lists и что элемент сортируются в соответствии со значением возврата. В этом случае мы

  • раскол один раз на пробельном, начиная с правой
  • взять последний элемент раскола
  • поворота, в целое число

Аргумент key может быть любым но лямбда просто более компактна. Вы можете попробовать его в командной строке:

>>> key_function = lambda s: int(s.rsplit(None, 1)[-1]) 
>>> key_function('ben 10') 
10 
>>> key_function('Guido van Rossum 42') 
42 

В сущности, при сортировке значения являются дополненной с возвращаемым значением этой функции, а также то, что сортируется является:

[(20, 0, 'jack 20'), (10, 1, 'ben 10'), (50, 2, 'alisdar 50'), (35, 3, 'ollie 35')] 

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

Результат:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35'] 
>>> lists.sort(key=lambda s: int(s.rsplit(None, 1)[-1])) 
>>> lists 
['ben 10', 'jack 20', 'ollie 35', 'alisdar 50'] 
+0

Благодарим вас за этот замечательный ответ, пожалуйста, можете ли вы рассказать о том, как работает key = lamdba? В первый раз я буду использовать его, большое спасибо. – jackdh

+0

Благодарим вас за распространение этого очень информативного! – jackdh

3

Используйте key функцию, которая делает то, что вы хотите:

lists.sort(key=lambda e: int(e.split()[1])) 

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

1

Было бы лучше, если бы вы имели более подходящий тип данных, чем строка для представления, скажем, имя человека и возраст. Одним из способов может быть словарь:

lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35'] 
d = dict(item.split(' ') for item in lists) 

Это построение словаря из потока двухэлементных списков.

Тогда вы можете сортировать так:

print sorted((v, k) for k, v in d.iteritems()) 

и получить это:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35'] 
>>> d = dict(item.split(' ') for item in lists) 
>>> print sorted((v, k) for k, v in d.iteritems()) 
[('10', 'ben'), ('20', 'jack'), ('35', 'ollie'), ('50', 'alisdar')] 

Или вы можете преобразовать возраст в целое:

>>> lists = ['jack 20', 'ben 10', 'alisdar 50', 'ollie 35'] 
>>> person_iter = (item.split(' ') for item in lists) 
>>> d = {k: int(v) for k, v in person_iter} 
>>> print sorted((v, k) for k, v in d.iteritems()) 
[(10, 'ben'), (20, 'jack'), (35, 'ollie'), (50, 'alisdar')] 

person_iter является генератор, который производит пары именного возраста.Вы передаете это понимание словаря и преобразуете второй аргумент в целое.

Основная идея состоит в том, что вам будет легче, если вы используете более точные типы данных для своих целей.

+0

Итак, я понимаю, что вы сделали, но для примера, как это будет более полезно/может быть проще? Спасибо. – jackdh

+1

У вас уже было несколько ответов, один из которых вы приняли как ваш выбор. Я не прихожу к этому, чтобы решить только вашу конкретную проблему, но дать вам более подробную картину того, как подходить к программированию. Мое решение сопоставимо по сложности с другими, но когда вы пытаетесь использовать данные для других проблем, вы обнаружите, что мои работы лучше, потому что структура данных, которую я рекомендую, имеет операции, более непосредственно связанные с тем, что вы хотите сделать. – hughdbrown

+0

Хорошо, я тебя понимаю, большое спасибо за то, что нашли время, чтобы прокомментировать. – jackdh

Смежные вопросы