【问题标题】:How to return a dictionary key, based on searching multiple values如何根据搜索多个值返回字典键
【发布时间】:2012-07-08 07:55:35
【问题描述】:

总的来说,我对 python 和脚本还很陌生,所以请多多包涵……

我有一个包含键值对的 python 字典,其中的值是一个嵌套列表,其中包含 3d 几何矩阵的位置:

{Point_Index: [position_X, position_Y, position_Z]}

我应该提到键是唯一的,但值不是。

如何根据字典中的最高 position_X、position_y 和 Position_Z 搜索字典并返回 Point_Index 键?

这是我的字典示例:

Polygon1 = {0: [-3.1890000000000001, -3.1890000000000001, -0.30361509588790281], 9: [3.1890000000000001, -3.1890000000000001, -0.30361509588790281], 10: [-3.1890000000000001, 3.1890000000000001, -0.30361509588790281], 11: [3.1890000000000001, 3.1890000000000001, -0.30361509588790281]}

我正在尝试测试点位置以定位笛卡尔空间中给定向量中的最外点。所以 (max_X, Max_Y, Max_Z) 可以看作是最右上的点,而 (min_X, max_Y, max_Z) 是最左上的点。最左下点是 (min_X, min_Y, min_Z),最右下点是 (max_X, min_Y, min_Z)。

我尝试了各种方法,例如 get、max,但我真的只是因为缺乏经验而在黑暗中磕磕绊绊。

感谢您的帮助!

【问题讨论】:

  • 请张贴示例来说明您的问题,即包含几个点的字典 - 并指定所需的输出。
  • 简单的方法是有一个 tmp 变量,存储具有最高 X、Y、Z 值的键名,以及包含当前最高值的 tmp 列表,然后与其余的进行比较。你可以用一个简单的循环来做到这一点。它会起作用的。从那里,我们可以讨论优化。
  • 如果两个列表是这样的[12,10,20][4,20,15],比较的标准是什么?
  • Polygon1 的预期输出是什么?
  • 我正在尝试测试点位置以定位笛卡尔空间中给定向量中的最外点。所以 (max_X, Max_Y, Max_Z) 可以看作是最右上的点,而 (min_X, max_Y, max_Z) 是最左上的点。最左下点是 (min_X, min_Y, min_Z),最右下点是 (max_X, min_Y, min_Z)。

标签: python dictionary


【解决方案1】:
max( (v[0],k) for k,v in dictionary.items() )[1]
max( (v[1],k) for k,v in dictionary.items() )[1]
max( (v[2],k) for k,v in dictionary.items() )[1]

【讨论】:

  • @HughBothwell:对不起,我改了。
【解决方案2】:

您可以将maxkey 函数一起使用:

>>> Polygon1 = {0: [-3.1890000000000001, -3.1890000000000001, -0.30361509588790281], 9: [3.1890000000000001, -3.1890000000000001, -0.30361509588790281], 10: [-3.1890000000000001, 3.1890000000000001, -0.30361509588790281], 11: [3.1890000000000001, 3.1890000000000001, -0.30361509588790281]}
>>> max(Polygon1, key=lambda k: Polygon1[k][0])
9
>>> max(Polygon1, key=lambda k: Polygon1[k][1])
10
>>> max(Polygon1, key=lambda k: Polygon1[k][2])
0

【讨论】:

    【解决方案3】:

    以下 Python 示例应该可以解决您的问题。

    score = lambda x,y,z: x+y+z
    
    best_key = max(
        mydict.iteritems(),
        key = lambda i:score(*i[1])
    )[0]
    

    【讨论】:

    • x,y,z 的总和可能不是匹配两个坐标的标准。
    • @AshwiniChaudhary:是的;关键是该标准已从迭代中抽象出来。如果他想根据不同的标准进行排序,他可以轻松完成。
    • 我不确定这是否可行。如果我有一个值为 (2,2,-2) 的点和一个值为 (-2,2,2) 的点,两者返回的分数是否相同?对不起,如果我误解了。
    • @user1510490:是的,两者的分数相同。如果你能解释哪一项得分更高,我们可以提出一个更好的得分函数。
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多