Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用map函数迭代Python中字典列表中的值_Python_List_Sorting_Dictionary_List Comprehension - Fatal编程技术网

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

使用map函数迭代Python中字典列表中的值,python,list,sorting,dictionary,list-comprehension,Python,List,Sorting,Dictionary,List Comprehension,我一直在尝试处理存储在字典列表中的数据,并将其存储在另一个元组列表中。例如,假设我有以下数据: triangles= [{"name": "triangle1", "base":3, "height":4}, {"name": "triangle2", "base":5, "height":12}, {"name": "triangle3", "base":8, "height":15} ] 我想通过以下我无法更改的函数

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

triangles= [{"name": "triangle1", "base":3, "height":4}, 
            {"name": "triangle2", "base":5, "height":12}, 
            {"name": "triangle3", "base":8, "height":15}
           ]
我想通过以下我无法更改的函数运行所有数据:

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

    return hyp_sq**(1.0/2.0)
理想情况下,在计算完所有数据后,我希望根据三角形的斜边长度对三角形进行排序,并返回以下格式的元组列表:

hypotenuse_results=[("triangle1", 5), ("triangle2", 13), ("triangle3", 17)]
我知道我必须将map()函数与sorted()结合使用,但我不知道如何只传递与“base”和“height”键对应的值

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


谢谢

您需要修改斜边函数,例如:

def hypotenuse(triangle):
    hyp_sq=triangle["base"]**2 + triangle["height"]**2
    return (triangle["name"], hyp_sq**(1.0/2.0))
map将返回一个元组生成器,当每个元组为(name,hyp)时,只需使用元组的第二个元素进行排序:

sorted(map(hypotenuse, triangles), key=lambda x: x[1])
更新:

因为您不能更改斜边函数,所以可以使用列表理解:

sorted([(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles], key=lambda x: x[1])
hypotenuse_results = [(t['name'], hypotenuse(**t)) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])

您需要修改斜边函数,例如:

def hypotenuse(triangle):
    hyp_sq=triangle["base"]**2 + triangle["height"]**2
    return (triangle["name"], hyp_sq**(1.0/2.0))
map将返回一个元组生成器,当每个元组为(name,hyp)时,只需使用元组的第二个元素进行排序:

sorted(map(hypotenuse, triangles), key=lambda x: x[1])
更新:

因为您不能更改斜边函数,所以可以使用列表理解:

sorted([(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles], key=lambda x: x[1])
hypotenuse_results = [(t['name'], hypotenuse(**t)) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])

大约在1993年,Python获得了lambda、reduce()、filter()和map(),这是一位Lisp黑客的功劳,他错过了这些工具并提交了可用的补丁。这些Lisp风格的结构在Python中被认为有点陌生,特别是在2000年引入列表理解之后。所以,不需要映射,可以使用列表理解或生成器表达式

您可以让
斜边
函数接受额外的参数并忽略它们:

def hypotenuse(base, height, **kwargs):
    hyp_sq=base**2+height**2
    return hyp_sq**(1.0/2.0)
然后您可以使用列表:

sorted([(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles], key=lambda x: x[1])
hypotenuse_results = [(t['name'], hypotenuse(**t)) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
即使对于较大的
len(三角形)
,这也应该足够好。生成器表达式版本为:

unsorted_results = ((t['name'], hypotenuse(**t)) for t in triangles)
hypotenuse_results = sorted(unsorted_results, key=lambda pair: pair[1])
分析这两个解决方案并在这里发布将是一个很好的练习


谢谢。有没有不修改斜边函数的方法卡内塞

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

hypotenuse_results = [(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
请注意,公认的解决方案是分配一个实际的列表并将其删除,因此如果您关心内存占用,您可能希望使用生成器表达式而不是列表理解(如果
len(三角形)
很大,但始终是一个好习惯,则特别有用):


大约在1993年,Python获得了lambda、reduce()、filter()和map(),这是一位Lisp黑客的功劳,他错过了这些工具并提交了可用的补丁。这些Lisp风格的结构在Python中被认为有点陌生,特别是在2000年引入列表理解之后。所以,不需要映射,可以使用列表理解或生成器表达式

您可以让
斜边
函数接受额外的参数并忽略它们:

def hypotenuse(base, height, **kwargs):
    hyp_sq=base**2+height**2
    return hyp_sq**(1.0/2.0)
然后您可以使用列表:

sorted([(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles], key=lambda x: x[1])
hypotenuse_results = [(t['name'], hypotenuse(**t)) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
即使对于较大的
len(三角形)
,这也应该足够好。生成器表达式版本为:

unsorted_results = ((t['name'], hypotenuse(**t)) for t in triangles)
hypotenuse_results = sorted(unsorted_results, key=lambda pair: pair[1])
分析这两个解决方案并在这里发布将是一个很好的练习


谢谢。有没有不修改斜边函数的方法卡内塞

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

hypotenuse_results = [(t['name'], hypotenuse(t['base'], t['height'])) for t in triangles]
hypotenuse_results.sort(key=lambda pair: pair[1])
请注意,公认的解决方案是分配一个实际的列表并将其删除,因此如果您关心内存占用,您可能希望使用生成器表达式而不是列表理解(如果
len(三角形)
很大,但始终是一个好习惯,则特别有用):


由于您的
斜边
函数在此处工作正常,因此您可以构建一个理解来创建元组列表:

from operator import itemgetter

result = sorted(((x['name'], hypotenuse(x['base'], x['height'])) for x in triangles), key = itemgetter(1))

print(result)
其中:

[('triangle1', 5), ('triangle2', 13), ('triangle3', 17)]
或者,如果您确实想使用
map()
,您可以尝试以下方法:

result = sorted(map(lambda x: (x['name'], hypotenuse(x['base'], x['height'])), triangles), key = itemgetter(1))
注意:您可以使用
lambda x:x[1]
代替。这只是偏好的问题。如果您感兴趣,您可以阅读以了解两者之间的性能,以及它们各自的优缺点

更新:


@Paulo Scardine在评论中指出,如果
triangle
将来变得更大,那么在
sorted()
中使用生成器表达式会更有效。这是因为列表理解会当场创建一个列表,但是
sorted()
会在过程中以任何方式删除该列表,因此在不需要列表时传入列表是一种浪费。对于第二个示例,这不是问题,因为
map()
已经返回了一个生成器。我更新了上面的代码以说明这些建议

由于您的
斜边
函数在此处运行良好,因此您可以构建一个理解来创建元组列表:

from operator import itemgetter

result = sorted(((x['name'], hypotenuse(x['base'], x['height'])) for x in triangles), key = itemgetter(1))

print(result)
其中:

[('triangle1', 5), ('triangle2', 13), ('triangle3', 17)]
或者,如果您确实想使用
map()
,您可以尝试以下方法:

result = sorted(map(lambda x: (x['name'], hypotenuse(x['base'], x['height'])), triangles), key = itemgetter(1))
注意:您可以使用
lambda x:x[1]
代替。这只是偏好的问题。如果您感兴趣,您可以阅读以了解两者之间的性能,以及它们各自的优缺点

更新:


@Paulo Scardine在评论中指出,如果
triangle
将来变得更大,那么在
sorted()
中使用生成器表达式会更有效。这是因为列表理解会当场创建一个列表,但是
sorted()
会在过程中以任何方式删除该列表,因此在不需要列表时传入列表是一种浪费。对于第二个示例,这不是问题,因为
map()
已经返回了一个生成器。我更新了上面的代码以说明这些建议

您必须使用
map()
?还是你认为你需要?我以为我需要。Map允许您在列表上运行函数,对吗?是否必须使用
Map()
?还是你认为你需要?我以为我需要。映射可以让你在列表上运行一个函数,对吗?这就解决了