1

我正在尝试对 2 级嵌套默认字典进行递归排序。我一直无法弄清楚如何正确地做到这一点。我的问题陈述如下:

  1. 第一级键必须是自然排序。
  2. 二级键必须按特定顺序排序。我试图创建一个列表,其索引代表元素的顺序。我的代码片段如下:

    import operator
    import collections
    trade_group_totals = collections.defaultdict(lambda:collections.defaultdict(float))    
    trade_group_totals['foo']['ABC'] = 100
    trade_group_totals['foo']['XYZ'] = 50
    trade_group_totals['bar']['ABC'] = 150
    trade_group_totals['bar']['XYZ'] = 250
    

我的排序索引比较:

trade_groups = ['XYZ', 'ABC']

def TradeGroupSort(trade_group):
   return trade_groups.index(trade_group)   

def SortTotals(totals, sort_function_one, sort_function_two):
  return [
      (k1, v1) for k1, v1 in [(k, sorted(v.iteritems(), key=sort_function_two))
           for k, v in sorted(totals.iteritems(), key=sort_function_one)]]

我正在调用该函数,如下所示:

SortTotals(
    trade_group_totals, operator.itemgetter(0),
    sort_function_two=lambda x: operator.methodcaller('TradeGroupSort', x))

我的预期输出应该是:

[('bar', [('XYZ', 50), ('ABC', 100)]), ('foo', [('XYZ', 250), ('ABC', 150)])]

但生成的输出是

[('bar', [('XYZ', 50), ('ABC', 150)]), ('foo', [('ABC', 150), ('XYZ', 250)])]
4

2 回答 2

0

它可能看起来有点古怪,但实际上非常简单。首先,您从 items 方法创建主键和值的列表(辅助字典)。您有一个明确的排序,因此您可以简单地使用该顺序从内部字典中获取元素,并根据需要按定义对其进行排序,而不是尝试按此排序。

然后,您可以按照您喜欢的方式对主键进行排序(在这种情况下,只需简单排序)。

items = [ (k,sorted(v.items(),key=itemgetter(1),reverse=True)) 
                              for k,v in trade_group_totals.items()]
items_sortes = sorted(items,reverse=True)

根据您对特定问题的自然排序的含义,您可以更改次要排序而不必担心第一个排序

于 2012-10-29T23:20:35.237 回答
0

不幸的是,没有一个解决方案对我有用。这是我想出的 UGLY 排序。

def TradeGroupSort(trade_group):
  """Sorting the trade group."""
  group, _ = trade_group  # The value is a tuple ('XYZ', 50) for e.g.
  return trade_groups.index(group)

我想不出比这更好的解决方案了。我调用这个函数如下:

SortTotals(trade_group_totals, operator.itemgetter(0), TradeGroupSort)

这将返回预期的结果。

于 2012-11-05T02:45:23.827 回答