使用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()
?还是你认为你需要?我以为我需要。映射可以让你在列表上运行一个函数,对吗?这就解决了