仅通过其中一个值对复杂的Python字典进行排序

Mar*_*ske 6 python sorting dictionary python-3.x

我正在写一个用于在邮局购买邮票的小优化工具.

在这个过程中,我正在使用一个字典,我根据我在其他"着名"问题中学到的东西进行排序: 按值排序Python字典

在我的情况下,我的字典稍微复杂一些:
- 一个四项目元组来制作密钥
- 另一个五项目元组来制作数据.

这个字典的来源是一个迭代,每个成功的循环都添加一行:

MyDicco[A, B, C, D] = eval, post, number, types, over
Run Code Online (Sandbox Code Playgroud)

这是一个简单的运行的只是一个很小的例子,试图为75美分:
{
(0,0,1,1):(22,75,2,2,0)
(0,0,0,3):(31,75,3,1,0)
(0,0,2,0):(2521,100,2,1,25)
(0,1,0,0):(12511,200,1,1,125 )
(1,0,0,0):( 27511,350,1,2,275)
}

到目前为止,我使用此代码进行排序(正在工作):

MyDiccoSorted = sorted(MyDicco.items(), key=operator.itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

我按照我的评分进行排序,因为排序是为了将最佳解决方案带到顶端.评估得分只是五项目元组中的一个数据(在示例中,这些是评估得分:22,31,2521,12511和27511).

正如你在上面的例子中看到的那样,它是由第二个元组索引1进行排序(如我所愿).但是我不得不(脾气暴躁地)将我的"评分"带到我的第二个元组的前面.代码显然是使用整个二元组来进行排序过程,这很重且不需要.


这是我的问题:我怎样才能更精确地排序.我不想按字典的第二个元组排序:我想准确地定位第一个项目.
理想情况下,我想把这个值恢复到原来的位置,即成为第二个元组中的最后一个项目 - 并且仍然按它排序.


我已经阅读并试验了operator.itemgetter()的语法,但还没有设法"抓住""我的第二个项目的第一项". https://docs.python.org/3/library/operator.html?highlight=operator.itemgetter#operator.itemgetter

(注意:允许使用元组作为键和值,根据:
https://docs.python.org/3/tutorial/datastructures.html?highlight/_Dictionary ,这些对我的项目工作正常;这个问题是只是为了更好的排序)


对于那些喜欢一点背景的人(你会对我大喊我应该使用其他方法,但我现在正在学习字典(这是这个项目的目的之一)):

这种优化适用于发展中国家,这些国家通常没有某些邮票价值,或者在任何特定邮局的库存有限.它稍后将在Android手机上运行.

我们正在定期邮寄(是的,信件).如果您考虑六种不同的基于目的地的邮资和数百封邮件信件,那么使用可用值确定每个目的地的确切邮资并找到具有特定值的低库存的解决方案是一个不平凡的过程.

还有其他模块可以帮助将理论上的最佳解决方案变成可以在任何一天实际购买的东西,通过战略对话指导......

关于我在这个问题上的字典:我迭代所有合理的(高到足以制作所需的邮资,并且只支付高达一个邮票的一小部分)邮票价值的组合.

然后我计算一个"成功"值,它基于所需的邮票数量(优先级),所需类型的数量(较低的优先级)(因为购买不同的邮票需要额外的时间在柜台)和非常高的支付罚款-过度.所以最低价值意味着最高成功.

我在字典中收集所有合理的"解决方案",其中需要标记的元组作为关键字,而另一些结果数据的元组构成了值.它有点过度定义,因为人类需要在项目的这个阶段读取它(用于调试).

如果你很好奇并且想要阅读这个例子(第一行):
colums是:

  • 邮票数量为350美分
  • 邮票数量为200美分
  • 邮票数量为50美分
  • 邮票数量为25美分
  • 评价得分
  • 计算应用邮资
  • 申请的邮票总数
  • 邮票类型的总数
  • 以美分超额支付

或者说:(假设邮政服务提供350,200,50和25美分的现有邮票),我可以使用1x50美分和1x25美分的邮资75美分.这给了我22的成功率(这个列表中最好的),邮资是75美分,需要两个不同价值的邮票和0美分多付.

Mor*_*app 4

您可以只使用双索引,这样的东西应该可以工作:

MyDiccoSorted = sorted(MyDicco.items(), key=lambda s: s[1][2])
Run Code Online (Sandbox Code Playgroud)

只需设置2为元组中 ID 的索引即可。