使用map函数迭代Python中字典列表中的值

can*_*cse 1 python sorting dictionary list-comprehension list

我一直在尝试处理存储在字典列表中的数据,并将其存储在另一个元组列表中.例如,说我有以下数据:

triangles= [{"name": "triangle1", "base":3, "height":4}, 
            {"name": "triangle2", "base":5, "height":12}, 
            {"name": "triangle3", "base":8, "height":15}
           ]
Run Code Online (Sandbox Code Playgroud)

我想通过以下函数运行所有数据,我无法更改:

def hypotenuse(base, height):
    hyp_sq=base**2+height**2

    return hyp_sq**(1.0/2.0)
Run Code Online (Sandbox Code Playgroud)

理想情况下,在计算完所有数据之后,我想根据它们的斜边长度对三角形进行排序,我想以下列格式返回元组列表:

hypotenuse_results=[("triangle1", 5), ("triangle2", 13), ("triangle3", 17)]
Run Code Online (Sandbox Code Playgroud)

我知道我必须结合sorted()使用map()函数,但我不知道如何仅传递对应于"base"和"height"键的值.

如果有人能指出我正确的方向,我将不胜感激.

谢谢

Pau*_*ine 6

大约在1993年,Python得到了lambda,reduce(),filter()和map(),这是一个错过了他们并提交工作补丁的Lisp黑客的礼貌.在2000年引入列表推导之后,这些Lisp风格的结构在Python中被认为是有点陌生​​.所以不,你不需要map,你可以使用列表推导或生成器表达式.

你可以让你的hypotenuse函数采取额外的参数并忽略它们:

def hypotenuse(base, height, **kwargs):
    hyp_sq=base**2+height**2
    return hyp_sq**(1.0/2.0)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用列表理解:

hypotenuse_results = [(t['name'], hypotenuse(**t)) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
Run Code Online (Sandbox Code Playgroud)

即使对于大型,这也应该足够好len(triangles).生成器表达式版本是:

unsorted_results = ((t['name'], hypotenuse(**t)) for t in triangles)
hypotenuse_results = sorted(unsorted_results, key=lambda pair: pair[1])
Run Code Online (Sandbox Code Playgroud)

分析这两个解决方案并在这里发布将是一个很好的练习.

谢谢.有没有办法解决这个问题而不修改斜边函数? - canecse

当然!只需用两个参数调用它:

hypotenuse_results = [(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
Run Code Online (Sandbox Code Playgroud)

请注意,接受的解决方案是分配一个实际的列表并将其抛弃,这样如果您担心内存占用,可能需要使用生成器表达式而不是列表解析(如果len(triangles)很大但特别有用,则特别有用):

hypotenuse_results = sorted(
    ((t['name'], hypotenuse(t['base'], t['height'])) for t in triangles), 
    key=lambda x: x[1]
)
Run Code Online (Sandbox Code Playgroud)