Python字典来排序元组,这可以做得更好吗?

rr.*_*rr. 1 python sorting dictionary iterable generator

我的输入有一个dictonary有以下特点:

  • 每个值都可以是整数,字符串或可迭代(除了字符串).
  • 如果元素是可迭代的,则该iterable中的每个元素将只是一个字符串或整数.

例如:

mydict = {
    'one': 1,
    'two': '23',
    'three': 3,
    'four': [
        7,
        '6',
        5,
        8
    ],
    'nine': 9
}
Run Code Online (Sandbox Code Playgroud)

我需要将输入转换为元组列表,其中每个元组是键/值对.对于可迭代元素,每个元素都有一个键/值对,按值排序.例如,上面的输出应该是:

('four', 5)
('four', 7)
('four', 8)
('four', '6')
('nine', 9)
('one', 1)
('three', 3)
('two', '2')
Run Code Online (Sandbox Code Playgroud)

我目前使用以下生成器实现了这个:

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))
Run Code Online (Sandbox Code Playgroud)

我觉得这可以用更干净的方式完成,有任何改进建议吗?

Joh*_*ooy 5

>>> 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')]
Run Code Online (Sandbox Code Playgroud)

这里的想法是,如果值是a int或a str,则将其放入list.现在问题被简化了,因为你有一个值,你总是可以迭代

如果你确定你只需要检查intstr(不是子类或unicode),你可以使用

sorted((i,k) for i,j in mydict.items() for k in ([j] if type(j) in (int, str) else j))
Run Code Online (Sandbox Code Playgroud)

如果值可以是unicode,则应使用isinstance(j, basestring)而不是isinstance(j, str)