Skip to main content
 首页 » 编程设计

用于排序元组的 Python 字典,可以做得更好吗

2025年05月04日21zengkefu

我有一个具有以下特征的输入字典:

  • 每个值都可以是整数、字符串或可迭代对象(字符串除外)。
  • 如果元素是可迭代的,则该可迭代中的每个元素都将只是一个字符串或整数。

例如:

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)) 

我觉得这可以用更简洁的方式完成,有什么改进建议吗?

请您参考如下方法:

>>> 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(不是子类或 unicode),你可以使用

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)