我的输入具有以下特征:
例如:
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))
我觉得这可以用更干净的方式完成,有任何改进建议吗?
答案 0 :(得分: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')]
这里的想法是,如果值为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)
答案 1 :(得分:1)
for values in sorted(mydict.items()):
if isinstance(values[1], list):
for x in sorted(values[1]):
print (values[0], x,)
else:
print values
答案 2 :(得分:0)
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