Python Sort двумерный словарь по первому ключу - PullRequest
2 голосов
/ 23 сентября 2010

У меня есть двумерный словарь в Python, проиндексированный двумя IP-адресами. Я хочу сгруппировать словарь по первому ключу.

Например, предыдущий будет выглядеть так:

myDict["182.12.17.50"]["175.12.13.14"] = 14
myDict["182.15.12.30"]["175.12.13.15"] = 10
myDict["182.12.17.50"]["185.23.15.69"] = 30
myDict["182.15.12.30"]["145.33.34.56"] = 230

так

for key1, key2 in myDict:
     print key1 +"   " +key2 +"   " +myDict[key1, key2]

напечатает

182.12.17.50   175.12.13.14   14
182.15.12.30   175.12.13.15   10
182.12.17.50   185.23.15.69   30
182.15.12.30   145.33.34.56   230

Но я хочу отсортировать его так, чтобы он вывел

182.12.17.50   175.12.13.14   14
182.12.17.50   185.23.15.69   30
182.15.12.30   175.12.13.15   10
182.15.12.30   145.33.34.56   230

Есть идеи, как этого достичь?

Ответы [ 5 ]

3 голосов
/ 24 сентября 2010

Ну, есть множество вариантов. Одним из них будет сортировка ключей перед печатью, что-то вроде этого:

for key1 in sorted(myDict):
    for key2 in myDict[key1]:
        print key1 +"   " +key2 +"   " +myDict[key1][key2]

Другой вариант - использовать класс sorteddict из модуля blist (отказ от ответственности: я автор :)), который всегда будет возвращать ключи в отсортированном порядке.

В любом случае, поскольку ключи являются IP-адресами, вы можете написать собственную функцию «ключа» для передачи в sort / sorted / sorteddict, чтобы они сортировались по числовому значению, а не лексикографически в виде строки.

1 голос
/ 23 сентября 2010

У Dicts нет порядка, но вы можете получить отсортированный список предметов.

>>> sorted((k, sorted(v.items())) for k,v in myDict.items())
[('182.12.17.50', [('175.12.13.14', 14), ('185.23.15.69', 30)]), 
 ('182.15.12.30', [('145.33.34.56', 230), ('175.12.13.15', 10)])]
0 голосов
/ 23 сентября 2010

Словари являются неупорядоченным типом, и в вашем примере я не вижу причины, по которой вы бы хотели, чтобы заказ был заказан.

Если вам нужно создать упорядоченную серию содержимого словаря, то есть его элементов, вы можете сделать это, просто применив sorted:

# Returns sorted list of item tuples
sorted(myDict.iteritems())

Или проверьте OrderedDict, поддерживает ли ваша версия Python ее, и вы знаете, что значит иметь отсортированный словарь.

0 голосов
/ 23 сентября 2010

Полагаю, я не очень хорошо понял проблему.

Разве вывод вышеупомянутого словаря не будет выглядеть следующим образом:

>>> myDict
{'182.12.17.50': {'185.23.15.69': 30, '175.12.13.14': 14}, '182.15.12.30': {'175.12.13.15': 10, '145.33.34.56': 230}}

, и тогда вы сможете использовать OrderedDict для созданияотсортированный словарь.

0 голосов
/ 23 сентября 2010

Вы можете передать пользовательскую функцию сравнения в Sorted. http://docs.python.org/library/functions.html#sorted

С его помощью вы можете указать, какой ключ сравнивать и как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...