使用 heapq 模块的两个函数 nlargest() 和 nsmallest() 列出同一集合中最大的两项和最小的两项
make a list of the largest two and smallest two items of the same collection using the heapq module two functions nlargest() and nsmallest()
在这种情况下,我想根据字典键列出字典列表中最大的两项和最小的两项 'price' - 如下代码所示 - 使用 heapq 模块二函数 nlargest() 和 nsmallest()
我试过这段代码但没有用:
import heapq
portfolio = [
{'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
{'name': 'APPLE', 'shares': 200, 'price': 21.09},
{'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]
cheap = heapq.nsmallest(2, portfolio)
expensive = heapq.nlargest(2, portfolio)
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)
然后我找到了一个使用 lambda 的解决方案,它确实有效!但我没明白:
这是包含解决方案的版本,它可以工作,但我不明白在这种情况下使用 lambda:
import heapq
portfolio = [
{'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
{'name': 'APPLE', 'shares': 200, 'price': 21.09},
{'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]
# the lambda solution
cheap = heapq.nsmallest(2, portfolio, key=lambda x: x['price'])
expensive = heapq.nlargest(2, portfolio, key=lambda x: x['price'])
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)
这就是输出,这正是我所期望的:
the two cheap stocks: [{'name': 'APPLE', 'shares': 200, 'price': 21.09}, {'name': 'AMAZON', 'shares': 35, 'price': 31.75}]
the two expensive stocks: [{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22}, {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1}]
我希望能找到关于在函数 nlargest 或 nsmallest 的参数键中使用 lambda 的很好的解释,在此先感谢。
当你有一个元素列表并且想要对它们进行排序(或找到最大值等)时,你必须在不同元素之间进行比较。比较是 if x > 3:
、if x == y
等操作
现在,您的元素是字典。即,您有一个字典列表:
lst = [{'a': 'FACEBOOK', 'b': 100, 'c': 91.1},
{'a': 'MICROSOFT', 'b': 50, 'c': 543.22}]
如果你想找到这样的列表的最大值,你需要比较字典。 {'a': 'FACEBOOK', 'b': 100, 'c': 91.1}
是否大于 {'a': 'MICROSOFT', 'b': 50, 'c': 543.22}
?在您看来,它不是(因为 'c' 值)。但是 python 解释器不知道你想使用 'c' 键来比较字典。这就是您需要 key
参数的原因:它表示必须使用哪些数据来比较列表的两个元素。
在你的例子中,你告诉 heapq
class 通过使用与 'price' 键关联的值来比较堆中的两个字典。
有关详细信息,请查看 this 问题。
在这种情况下,我想根据字典键列出字典列表中最大的两项和最小的两项 'price' - 如下代码所示 - 使用 heapq 模块二函数 nlargest() 和 nsmallest() 我试过这段代码但没有用:
import heapq
portfolio = [
{'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
{'name': 'APPLE', 'shares': 200, 'price': 21.09},
{'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]
cheap = heapq.nsmallest(2, portfolio)
expensive = heapq.nlargest(2, portfolio)
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)
然后我找到了一个使用 lambda 的解决方案,它确实有效!但我没明白: 这是包含解决方案的版本,它可以工作,但我不明白在这种情况下使用 lambda:
import heapq
portfolio = [
{'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
{'name': 'APPLE', 'shares': 200, 'price': 21.09},
{'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]
# the lambda solution
cheap = heapq.nsmallest(2, portfolio, key=lambda x: x['price'])
expensive = heapq.nlargest(2, portfolio, key=lambda x: x['price'])
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)
这就是输出,这正是我所期望的:
the two cheap stocks: [{'name': 'APPLE', 'shares': 200, 'price': 21.09}, {'name': 'AMAZON', 'shares': 35, 'price': 31.75}]
the two expensive stocks: [{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22}, {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1}]
我希望能找到关于在函数 nlargest 或 nsmallest 的参数键中使用 lambda 的很好的解释,在此先感谢。
当你有一个元素列表并且想要对它们进行排序(或找到最大值等)时,你必须在不同元素之间进行比较。比较是 if x > 3:
、if x == y
等操作
现在,您的元素是字典。即,您有一个字典列表:
lst = [{'a': 'FACEBOOK', 'b': 100, 'c': 91.1},
{'a': 'MICROSOFT', 'b': 50, 'c': 543.22}]
如果你想找到这样的列表的最大值,你需要比较字典。 {'a': 'FACEBOOK', 'b': 100, 'c': 91.1}
是否大于 {'a': 'MICROSOFT', 'b': 50, 'c': 543.22}
?在您看来,它不是(因为 'c' 值)。但是 python 解释器不知道你想使用 'c' 键来比较字典。这就是您需要 key
参数的原因:它表示必须使用哪些数据来比较列表的两个元素。
在你的例子中,你告诉 heapq
class 通过使用与 'price' 键关联的值来比较堆中的两个字典。
有关详细信息,请查看 this 问题。