Python словарь для сортировки кортежей, это может быть сделано лучше? - PullRequest
1 голос
/ 22 июня 2011

У меня есть диктонар для моего ввода со следующими характеристиками:

  • Каждое значение будет целым, строковым или итеративным (кроме строки).
  • Если элемент является итеративным, каждый элемент в этой итерируемой будет только строкой или целым числом.

например:

mydict = {
    'one': 1,
    'two': '23',
    'three': 3,
    'four': [
        7,
        '6',
        5,
        8
    ],
    'nine': 9
}

Мне нужно преобразовать входные данные в список кортежей, где каждый кортеж является парой ключ / значение. Для итерируемых элементов будет пара ключ / значение для каждого из его элементов, отсортированных по значению. Например, вывод для вышеупомянутого должен быть:

('four', 5)
('four', 7)
('four', 8)
('four', '6')
('nine', 9)
('one', 1)
('three', 3)
('two', '2')

В настоящее время это реализовано с использованием следующего генератора:

def dict_to_sorted_tuples(unsorted_dict):
    for key in sorted(unsorted_dict):
        if isinstance(unsorted_dict[key], basestring):
            yield key, unsorted_dict[key]
            continue
        try:
            for v in sorted(unsorted_dict[key]):
                yield key, v
        except:
            yield key, unsorted_dict[key]

print list(dict_to_sorted_tuples(mydict))

Я чувствую, что это можно сделать чище, какие-либо предложения по улучшению?

Ответы [ 3 ]

5 голосов
/ 22 июня 2011
>>> sorted((i,k) for i,j in mydict.items() for k in ([j] if isinstance(j, str) or isinstance(j, int) else j))
[('four', 5), ('four', 7), ('four', 8), ('four', '6'), ('nine', 9), ('one', 1), ('three', 3), ('two', '2')]

Идея заключается в том, что если значение равно int или str, вы помещаете его в list. Теперь проблема упрощена, потому что у вас есть значение, которое вы всегда можете перебрать

Если вы действительно уверены, что вам нужно проверить только int или str (не подклассы или юникод), вы можете просто использовать

sorted((i,k) for i,j in mydict.items() for k in ([j] if type(j) in (int, str) else j))

Если значение может быть Unicode, вы должны использовать isinstance(j, basestring) вместо isinstance(j, str)

1 голос
/ 22 июня 2011
for values in sorted(mydict.items()):
    if isinstance(values[1], list):
        for x in sorted(values[1]):
            print (values[0], x,)
    else:
        print values
0 голосов
/ 22 июня 2011
def dict_to_sorted_tuples(unsorted_dict):
    res = []
    for k, v in sorted(unsorted_dict.iteritems()):
        if isinstance(v, (list, tuple)):
            res.extend((k, _v) for _v in sorted(v))
        else:
            res.append((k, v))
    return res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...