Python字典到排序的元组,这可以做得更好吗?
Posted
技术标签:
【中文标题】Python字典到排序的元组,这可以做得更好吗?【英文标题】:Python dictionary to sorted tuples, can this be done better? 【发布时间】:2011-09-20 01:48:51 【问题描述】:我的输入有一个字典,具有以下特征:
每个值都可以是整数、字符串或可迭代(字符串除外)。 如果元素是可迭代元素,则该可迭代元素中的每个元素都只能是字符串或整数。例如:
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))
我觉得这可以以更清洁的方式完成,有什么改进建议吗?
【问题讨论】:
【参考方案1】: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
【讨论】:
【参考方案2】:for values in sorted(mydict.items()):
if isinstance(values[1], list):
for x in sorted(values[1]):
print (values[0], x,)
else:
print values
【讨论】:
那么除了列表之外就没有可迭代对象了吗?另外,我会发现for key, value in sorted(mydict.items())
更具可读性,因为您不需要使用values[0]
和values[1]
。【参考方案3】:
>>> 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 @Trufa 在这种情况下,我建议不要在一行中这样做。至少,如果保持原样,这应该会提示多行注释,解释它对必须出现并维护它的人的作用。聪明而富有表现力,但需要解释。以上是关于Python字典到排序的元组,这可以做得更好吗?的主要内容,如果未能解决你的问题,请参考以下文章