回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>这与我在这里读过的关于字典值排序的其他各种问题有关,但我没有找到答案。我是个新手,也许我只是没有看到答案,因为它关系到我的问题。在</p>
<p>我有这个函数,我用它作为Django自定义过滤器来对字典列表中的结果进行排序。stackoverflow的一个主要功能就是回答这个问题。在</p>
<pre><code>def multikeysorting(dict_list, sortkeys):
from operator import itemgetter
def multikeysort(items, columns):
comparers = [ ((itemgetter(col[1:]), -1) if col.startswith('-') else (itemgetter(col), 1)) for col in columns]
def sign(a, b):
if a < b: return -1
elif a > b: return 1
else: return 0
def comparer(left,right):
for fn, mult in comparers:
result = sign(fn(left), fn(right))
if result:
return mult * result
else:
return 0
return sorted(items, cmp=comparer)
keys_list = sortkeys.split(",")
return multikeysort(dict_list, keys_list)
</code></pre>
<p>此过滤器在Django中的调用如下:</p>
^{pr2}$
<p>这意味着有两个字典值传递给函数来对字典列表进行排序。排序使用字典键,但不处理值。在</p>
<p>如何通过对具有多个值的词典列表进行排序并返回词典?在上面的例子中,先按值,然后按姓。在</p>
<p>以下是数据示例:
</p><pre>
[{u'TOT_PTS_Misc': < StatisticPlayerRollup: DeWitt, Ash Total Points : 6.0>, 'player': < Player: DeWitt, Ash>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Ackerman, Luke Total Points : 18.0>, 'player': < Player: Ackerman, Luke>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Wise, Dan Total Points : 19.0>, 'player': < Player: Wise, Dan>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Allison, Mike Total Points : 18.0>, 'player': < Player: Allison, Mike>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Wolford, Alex Total Points : 18.0>, 'player': < Player: Wolford, Alex>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Okes, Joe Total Points : 18.0>, 'player': < Player: Okes, Joe>},
{u'TOT_PTS_Misc': < StatisticPlayerRollup: Grattan, Paul Total Points : 18.0>, 'player': < Player: Grattan, Paul>}]
</pre>
<p>清单应按如下顺序排列:</p>
<pre>
LastName Points
Wise 19.0
Ackerman 18.0
Allison 18.0
Grattan 18.0
Okes 18.0
Wolford 18.0
Hagg 6.0
DeWitt 6.0
</pre>
<p>TOT_PTS_Misc是一个包含玩家姓名和点数的对象。(我希望我的解释是正确的。)</p>
<p>但是,应该有任意类型的值,升序或降序。不总是相同的值,可能不止两个。在</p>
<hr/>
<p>所以我想出了这个解决方案,但想知道它是否有意义,是否有什么需要改变的地方。在</p>
<pre>
def multikeysorting(dict_list, sortkeys):
from operator import itemgetter, attrgetter
klist = sortkeys.split(",")
vlist = []
for i in klist:
vlist.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(tuple(i.split(".")))
def getkeyvalue(val_list):
result = []
for id,val in enumerate(val_list):
if val[0].startswith('-'):
if len(val) == 2:
result.append((itemgetter(val[0][1:]).attrgetter(val[1]), -1))
else:
att = val[1]
for j in val[2:]:
att = att + "." + j
result.append((itemgetter(val[0][1:]).attrgetter(att), -1))
else:
if len(val) == 2:
result.append((itemgetter(val[0]).attrgetter(val[1]), 1))
else:
att = val[1]
for j in val[2:]:
att = att + "." + j
result.append((itemgetter(val[0]).attrgetter(att), 1))
return result
return sorted(dict_list, key=getkeyvalue(vlist))
</pre>