Python 接受整数或整数列表的函数
Python function that accepts either an integer or a list of integer
我需要一个函数,它有两个参数 a
(整数)和 b
(整数或整数列表),到 return True
如果 a == b
或 a in b
.
这可以通过在两个条件之间放置一个简单的 or
来轻松完成,但我想知道是否可以在一个条件下完成。
我想这样做:
a in list(b)
但它不起作用,因为整数不可迭代,
a in [b]
但如果 b
已经是一个列表,它就不起作用。
你可以做 return a == b if isistance(b, int) else a in b
,它是单行的,没有使用 or/and
。
不过我会选择更具可读性的版本:return a == b or (isinstance(b, list) and a in b)
括号允许您将条件分成两个不同的部分。如果 b
不是列表,则不会评估第二个条件的第二部分。
但是对我来说,如果 b
始终是一个列表,即使它只包含一个元素,它也会更清晰。
Ask for forgiveness - not permission!假设 b
是一个列表,如果不是,那么它一定是一个整数:
def foo(a, b):
try:
return a in b
except TypeError:
return a == b
如果硬要用一个expression/condition,我们这里其实可以用正则表达式:
import re
def foo(a, b):
return bool(re.search(rf"\b{a}\b", str(b)))
另一种方法是更改函数的签名以获取可变数量的变量,而不是将其传递给列表,它应该被解包:
def foo(a, *b):
return a in b
并调用它:
>>> foo(4, 4)
True
>>> foo(4, *[4, 5])
True
>>> foo(4, *[5, 3])
False
>>> foo(4, 3)
False
最佳解决方案是使用逻辑运算符。与最简单的解决方案相比,任何其他不涉及此特定情况的逻辑运算符的解决方案都是完全低效的。
话虽如此,推荐的选项如下:
a == b or (isinstance(b, list) and a in b)
但是,如果出于某种原因您想知道如何在没有逻辑运算符的情况下做到这一点,我有这个疯狂且完全不推荐选项:
str(a) in str(b).replace('[', '').replace(']', '').split(', ')
我认为最好的方法是使用按位运算符 &
为此,您需要将两个参数 (a, b) 转换为 set().
我没有找到另一种在不知道其类型的情况下将 b 转换为 set() 的方法。
所以我推荐:
new_b = set(b) if isinstance(b, list) else {b}
return a in ({a} & (new_b))
我需要一个函数,它有两个参数 a
(整数)和 b
(整数或整数列表),到 return True
如果 a == b
或 a in b
.
这可以通过在两个条件之间放置一个简单的 or
来轻松完成,但我想知道是否可以在一个条件下完成。
我想这样做:
a in list(b)
但它不起作用,因为整数不可迭代,a in [b]
但如果b
已经是一个列表,它就不起作用。
你可以做 return a == b if isistance(b, int) else a in b
,它是单行的,没有使用 or/and
。
不过我会选择更具可读性的版本:return a == b or (isinstance(b, list) and a in b)
括号允许您将条件分成两个不同的部分。如果 b
不是列表,则不会评估第二个条件的第二部分。
但是对我来说,如果 b
始终是一个列表,即使它只包含一个元素,它也会更清晰。
Ask for forgiveness - not permission!假设 b
是一个列表,如果不是,那么它一定是一个整数:
def foo(a, b):
try:
return a in b
except TypeError:
return a == b
如果硬要用一个expression/condition,我们这里其实可以用正则表达式:
import re
def foo(a, b):
return bool(re.search(rf"\b{a}\b", str(b)))
另一种方法是更改函数的签名以获取可变数量的变量,而不是将其传递给列表,它应该被解包:
def foo(a, *b):
return a in b
并调用它:
>>> foo(4, 4)
True
>>> foo(4, *[4, 5])
True
>>> foo(4, *[5, 3])
False
>>> foo(4, 3)
False
最佳解决方案是使用逻辑运算符。与最简单的解决方案相比,任何其他不涉及此特定情况的逻辑运算符的解决方案都是完全低效的。
话虽如此,推荐的选项如下:
a == b or (isinstance(b, list) and a in b)
但是,如果出于某种原因您想知道如何在没有逻辑运算符的情况下做到这一点,我有这个疯狂且完全不推荐选项:
str(a) in str(b).replace('[', '').replace(']', '').split(', ')
我认为最好的方法是使用按位运算符 &
为此,您需要将两个参数 (a, b) 转换为 set().
我没有找到另一种在不知道其类型的情况下将 b 转换为 set() 的方法。 所以我推荐:
new_b = set(b) if isinstance(b, list) else {b}
return a in ({a} & (new_b))