2012-05-09 2 views
4

Можно создать дубликат:
Sorting list of lists by a third list of specified non-sorted orderPython, сортировать список dicts по произвольном порядке

a = [{'id':1}, {'id':2}, {'id':3}] 
b = [2,1,3] 

Что бы хороший метод сортировки dict с помощью list Ь через id Недвижимость.

Результат должен выглядеть примерно так

[{'id':2}, {'id':1}, {'id':3}] 

ответ

7

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

In [1]: a = [{'id':1}, {'id':2}, {'id':3}] 

In [2]: b = [2,1,3] 

In [3]: a.sort(key=lambda v : b.index(v['id'])) 

In [4]: a 
Out[4]: [{'id': 2}, {'id': 1}, {'id': 3}] 

(Мне часто говорят, что есть альтернатива lambda, которая должна использоваться в наши дни, но это все еще самый ясный способ, который я знаю для do)

EDIT: Также обратите внимание, что это почти идентично this answer в связанном вопросе.

+0

+ 1: Я согласен: ключевой параметр часто забывают , и лямбда часто является самым ясным способом сделать это. – rubik

+1

Обратите внимание, что list.index выполняет линейный поиск, поэтому, если len (b) велико, это будет очень медленным. –

+0

, в этом случае он не должен становиться очень большим, менее 100 предметов. Но спасибо за записку. – Matt

3
dictFromList = dict(zip((x['id'] for x in a), a)) 
sortedList = [dictFromList[i] for i in b] 
+0

Учитывайте PEP 8. – rubik

+0

@rubik просто интересно, не могли бы вы расширить ваши PEP 8 комментариев? – Levon

+0

Именование должно быть 'dict_from_list', если оно следует за PEP8, а не с верблюжьим футляром – lukecampbell

1

Python 2.7:

def sort_dict_by_list(a, b):   
    sortkeys = { v: k for (k, v) in enumerate(b) } 
    return list(sorted(a, key=lambda x: sortkeys[x['id']])) 

a = [{ 'id': 1, 'name': 'foo' }, { 'id': 2, 'name': 'bar' }, { 'id': 3, 'name': 'baz' }] 
b = [2,1,3] 
print sort_dict_by_list(a, b) 

печатает:

[{'id': 2, 'name': 'bar'}, {'id': 1, 'name': 'foo'}, {'id': 3, 'name': 'baz'}] 
+0

По существу то же, что и Izkata, но O (n) сложность для ввода ключей вместо O (n^2) –

+0

В документах python подразумевается, что это то, что параметр 'key' делает внутренне – Izkata

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