【问题标题】:Python dictionary to sorted tuples, can this be done better?Python字典到排序的元组,这可以做得更好吗?
【发布时间】: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))

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

【问题讨论】:

    标签: python sorting generator iterable dictionary


    【解决方案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')]
      

      这里的想法是,如果值是intstr,则将其放入list。现在问题被简化了,因为你有一个可以随时迭代的值

      如果您确定只需要检查 intstr(不是子类或 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 在这种情况下,我建议不要在一行中这样做。至少,如果保持原样,这应该会提示多行注释,解释它对必须出现并维护它的人的作用。聪明而富有表现力,但需要解释。
      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多