2015-08-18 2 views
3

У меня есть словарь, где каждый ключ является кортежем значений, я хочу использовать метод sorted() для сортировки словаря на самом первом элементе моего кортежа. Мой код выглядит так:Как отсортировать словарь по первому элементу ключа (tuple)

def mapData(header_list, dict_obj): 
    master_dict = {} 
    client_section_list = [] 
    for element in header_list: 
     for row in dict_obj: 
      if (row['PEOPLE_ID'], row['DON_DATE']) == element: 
       client_section_list.append(row) 
     element = list(element) 
     element_list = [client_section_list[0]['DEDUCT_AMT'], 
        client_section_list[0]['ND_AMT'], 
        client_section_list[0]['DEDUCT_YTD'], 
        client_section_list[0]['NONDEDUCT_YTD'] 
        ] 
     try: 
      element_list.append((float(client_section_list[0]['DEDUCT_YTD']) + 
           float(client_section_list[0]['NONDEDUCT_YTD']) 
           )) 
     except ValueError: 
      pass 

    element.extend(element_list) 
    element = tuple(element) 
    master_dict[element] = client_section_list 
    client_section_list = [] 
return sorted(master_dict, key=lambda key: key[master_dict[(1)]] 

Последняя строка, где я пытаюсь найти способ ее сортировки. Мой кортеж выглядит следующим образом:

(312178078,6/22/15,25,0,25,0,25.0) 
+1

Что не так с кодом, который у вас есть? –

+4

Если ключи являются кортежами, то по умолчанию будет отсортирован по первому элементу этих кортежей. Но если вы _need_ для предоставления ключевой функции, попробуйте «lambda key: key [0]». Наконец, обратите внимание, что 'sorted (some_dict)' будет возвращать _ только ключи_ в отсортированном порядке, а не весь dict, т. Е. Вы теряете значения! –

+1

Вы хотите использовать 'dict.items()' в 'sorted', если ваша цель - сохранить всю структуру словаря. 'return sorted (master_dict.items(), key = lambda key: key [0] [0])' должен делать то, что вы хотите. – cziemba

ответ

3

Не совсем уверен, что вы пытаетесь сделать, особенно то, что должна вернуть эта функция. Я предполагаю, что вы хотите вернуть словарь, отсортированный по первому элементу в кортежах.

Для этого есть две вещи, чтобы отметить:

  1. кортежи по умолчанию отсортированный по их первым элементом (и, если таковые же, затем второй, и так далее), так функция специального ключа не требуется
  2. Регулярные словари неупорядочены, т. е. они не могут быть отсортированы в любом порядке в любом порядке; вы можете только сортировать их элементы в виде списка, или использовать этот список, чтобы создать OrderedDict вместо

Некоторые минимальный пример:

>>> d = {(2,4): 1, (1,3): 2, (1,2): 3, (3,1): 4} 
>>> sorted(d) 
[(1, 2), (1, 3), (2, 4), (3, 1)] 
>>> sorted(d.items()) 
[((1, 2), 3), ((1, 3), 2), ((2, 4), 1), ((3, 1), 4)] 
>>> collections.OrderedDict(sorted(d.items())) 
OrderedDict([((1, 2), 3), ((1, 3), 2), ((2, 4), 1), ((3, 1), 4)]) 

В вашем случае, вы, вероятно, хотите:

return collections.OrderedDict(sorted(master_dict.items())) 
2

Как @tobias_k отметил, sorted сортирует кортежи по его элементов с уменьшением приоритета, например если вы берете кортеж (a, b, c), то самый высокий приоритет сортировки равен a, затем идет b и т. д. (по умолчанию sorted использует методы сравнения объектов, и это сравнение tuple). Так sorted(master_dict) все, что вам нужно, если вы хотите получить список отсортированных ключей, но я верю, что вы действительно хотите, чтобы оставить значения

sorted(master_dict.items(), key=lambda key: key[0]) 

dict.items возвращает кортежи формы (key, value) так здесь нужно указать сортировочный key.

+1

Только частично исправлено. Если вы отсортируете 'dict.items()', то он будет _again_ сортировать по первому элементу кортежа по умолчанию, то есть без предоставления ключевой функции, dict-entries, такие как '((k1, k2, ...), (v1, v2, ...)) 'будет сортироваться по k1, затем по k2, ..., затем по v1, v2, .... и т. д. –

+1

@tobias_k вот почему я предоставляю функцию' key' в элемент 'dict.items' –

+1

Но это не имеет никакого эффекта. Если 'key' является кортежем, чем' lambda key: key [0] 'такой же, как и порядок сортировки по умолчанию, за исключением того, что в случае, если первый элемент в этом случае не существует, но это никогда не может быть в любом случае, поскольку ключи уникальны). –

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