我可以使用map将参数的元组(或列表)插入函数吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用map将参数的元组(或列表)插入函数吗?相关的知识,希望对你有一定的参考价值。

我的目标是创建一个函数来检查数字是否在给定范围内。

因此,我创建了一个函数range_check(),它接受三个参数-数字,低和高。我还创建了4个作为元组存储的测试用例。前三个测试用例为true,最后一个为false。

def range_check(num, low, high):
    return low <= num <= high


test_values = [(2, 1, 4), (5, 2, 7), (3, 1, 10), (3, 4, 5)]

for test_case in test_values:
    print(range_check(test_case[0], test_case[1], test_case[2]))

由于我最近发现了lambda以及如何使用它(我对Python和编程仍然是陌生的,所以我想尝试使用lambda和map解决这个问题(或者也可以在这里使用过滤器,我猜)

test_values = [(2, 1, 4), (5, 2, 7), (3, 1, 10), (3, 4, 5)]
print(list(map(lambda num, low, high: low <= num <= high, test_values)))

但是,这会产生错误-lambda缺少2个必需的参数-低和高。

有什么方法可以像这样将参数元组插入函数或lambda吗?

我想到的唯一一件事就是列出数字,低点和高点。

nums = [2, 5, 3, 3]
lows = [1, 2, 1, 4]
highs = [4, 7, 10, 5]

print(list(map(lambda num, low, high: low <= num <= high, nums, lows, highs)))

但是我认为这似乎并不容易,以后可能很难理解。

非常感谢您的任何帮助或想法。

答案

lambda函数无法自动解压缩参数。 maptuple传递给函数,而不是3个参数。您必须将一个参数用作tuple并访问元素:

test_values = [(2, 1, 4), (5, 2, 7), (3, 1, 10), (3, 4, 5)]
print(list(map(lambda t: t[1] <= t[0] <= t[2], test_values)))

这就是为什么简单的列表理解要好得多的原因:您可以在循环中解开元组:

[low <= num <= high for num,low,high in test_values]

它也更快,因为您不必链接函数调用,而且不那么隐秘。map+ lambda组合在速度和可读性方面不是最好的。

两者的结果均为[True, True, True, False]

另一答案

您正在看到将元组作为参数与将元组的elements作为单独的参数之间的区别。你可以写

print(list(map(lambda t: t[1] <= t[0] <= t[2], test_values)))

或者您可以使用itertools.starmap,为您有效地打开元组的包装。

from itertools import startup

print(list(starmap(lambda num, low, high: low <= num <= high, test_values)))

不过,在Python中,使用列表理解通常比显式使用map和函数更清晰地构建列表:

print([low <= num <= high for num, low, high in test_values])
另一答案

您可以使用zip和元组解包:

    test_values = [(2, 1, 4), (5, 2, 7), (3, 1, 10), (3, 4, 5)]

    print(list(map(lambda num, low, high: low <= num <= high, *zip(*test_values))))

返回[True, True, True, False]

我会补充说,列表理解对于这种事情更具可读性。甚至Guido也讨厌map ...

另一答案

我只用1行for循环来做到这一点:

print([range_check(*x) for x in test_values])

此x in函数参数前面的*使您的元组解压缩为更多变量。

以上是关于我可以使用map将参数的元组(或列表)插入函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

从列表中的元组替换字符串

map函数和reduce函数的区别

我可以使用 Python 的 Min 函数返回所有最小元组的列表吗?

Python中map和reduce函数

Python中的map与reduce函数简介

当我尝试插入由列表理解生成的元组列表时,executemany 抛出错误;如果它是硬编码的,则相同的列表有效