如何判断列表(或可迭代)的数字是否都具有相同的符号?
这是我的第一个(幼稚)草案:
def all_same_sign(list):
negative_count = 0
for x in list:
if x < 0:
negative_count += 1
return negative_count == 0 or negative_count == len(list)
Run Code Online (Sandbox Code Playgroud)
有更多的pythonic和/或正确的方法吗?首先想到的是一旦你有相反的迹象就停止迭代.
更新
到目前为止,我喜欢这些答案,尽管我对表现感到疑惑 我不是一个表演迷,但我认为在处理列表时考虑性能是合理的.对于我的特定用例,我不认为这将是一个大问题,但为了完整这个问题,我认为解决它是好的.我的理解是min和max函数具有O(n)性能.到目前为止,两个建议的答案具有O(2n)性能,而一旦检测到相反的符号,我的上述例程添加短路退出将具有最差的O(n)性能.思考?
我运行了代码
a = True
b = False
c = False
d = False
e = False
import time
iterations = int(1e6)
start = time.time()
for _ in range(iterations):
a or b or c or d or e
print(time.time() - start)
start = time.time()
for _ in range(iterations):
b or c or d or e or a
print(time.time() - start)
Run Code Online (Sandbox Code Playgroud)
结果
0.10876178741455078
0.26296424865722656
Run Code Online (Sandbox Code Playgroud)
我知道比较 int 和 None 类型在 Python3 (3.6.1) 中无效,正如我在这里看到的:
>>> largest = None
>>> number = 5
>>> number > largest
TypeError: '>' not supported between instances of int and NoneType
Run Code Online (Sandbox Code Playgroud)
但在这个脚本中,它没有给出 TypeError。
largest = None
for number in [5, 20, 11]:
if largest is None or number > largest:
largest = number
Run Code Online (Sandbox Code Playgroud)
当我使用 python3 运行此脚本时,它运行时不会出现 TypeError。为什么?
我正在尝试在列表中找到某个阈值以上的最小值,而不使用min()函数(我正在通过实践的方式来做事情)。
我先创建了一个高于阈值的值列表,然后遍历该列表,然后将一个值保存到小于先前看到的值的变量中来进行管理:
def minpass(mymarks, mypass):
passed= [x for x in mymarks if x >= mypass]
min_value = passed[0]
for x in passed:
if x < min_value:
min_value = x
return min_value
x = [2, 53, 90]
y = 50
minpass(x, y)
Run Code Online (Sandbox Code Playgroud)
这将正确返回53。
是否可以在不创建第二个列表(通过)的情况下执行此操作?为什么添加第二个条件不起作用?例如
def minpass(mymarks, mypass):
min_value = mymarks[0]
for x in mymarks:
if x < min_value and x >= mypass:
min_value = x
return min_value
x = [2, 53, 90]
y = 50
minpass(x, y)
Run Code Online (Sandbox Code Playgroud)
这将错误地返回2而不是53。
我必须维护一个自2008年以来不再更新的python包.我想当时开发人员使用的Python版本是2.3或2.4,我猜.大多数源代码都是一样的,但我找到了类似的东西:
fsa = (fsa and union(fsa, fsa2)) or fsa2
Run Code Online (Sandbox Code Playgroud)
其中fsa,fsa2,union(fsa, fsa2)都是对象.我不知道他们如何工作来返回新对象.有人可以给我一些提示吗?此外,这些运算符是否仍然允许在Python 2.7中使用?如果不是,我如何更改它以使其在Python 2.7中正常工作?
谢谢,
假设我有一个名为prop的成员的myObject类.我有一个变量var,可能是也可能不是myObject.我想检查prop是否包含某个值,如果是,则执行某些操作,如果没有,或者var不是myObject,请执行.
执行以下操作是否安全:
if isinstance(var, myObject) and var.prop == 10:
#Do something
Run Code Online (Sandbox Code Playgroud)
基本上,如果第一部分的计算结果为False,是否可以保证不会检查if语句的第二部分?如果检查即使var不是myObject,也会引发错误.
我在使用这段代码时遇到了一些麻烦:
if not fundbenchmark.endswith(("Index", "INDEX")) and fundbenchmark is not None:
fundbenchmark = "%s%s" % (fundbenchmark, " Index")
Run Code Online (Sandbox Code Playgroud)
追溯:
AttributeError: 'NoneType' object has no attribute 'endswith'
Run Code Online (Sandbox Code Playgroud)
当出现显然这个错误fundbenchmark是None.暗示存在问题and fundbenchmark is not None:
我在这个假设中是正确的还是可以在其他地方找到解释?
我在Python中遇到了gcd的这个实现:
def gcd(x,y): return y and gcd(y, x % y) or x
Run Code Online (Sandbox Code Playgroud)
我不明白的是布尔值在返回时是如何工作的?在解释器中尝试了一些数字后,我注意到and总是返回右边or的数字,而返回左边的数字.为什么是这样?另外,您可以一步一步地通过简单调用此函数来指导我,以便了解发生了什么?
python 是否短路布尔值a==b==c,即,如果a==b为假,则不评估第二个等式?复合相等只是 的语法糖a==b and b==c吗?
我一直在对 Python 运算符进行一些修改,但遇到了一些我不确定的事情。
如果我对 2 个整数执行按位运算 (&, |) ,我将毫不奇怪地得到它们的按位值
。意义:
>>> a = 11
>>> b = 3
>>> a & b
3
Run Code Online (Sandbox Code Playgroud)
这是因为按位和执行和对这些数字的二进制表示。但是,如果我使用内置的 and 运算符,我将获得第二个变量,而不管它是什么类型:
>>> b and a
11
>>> 'b' and 'a'
'a'
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我想检查数组中值的任何长度是否等于 1。我有一个数组
SLR = [4, 4000, 4010]
Run Code Online (Sandbox Code Playgroud)
我想检查这些值中的任何一个的长度:是否等于 1。在这种情况下,它是真的,因为有 4。
我试图这样做,但当然失败了:
SLR = [4, 4000, 4010]
if(any(len(SLR)) == 1):
print("True")
else:
print("False")
Run Code Online (Sandbox Code Playgroud) 我在 Kaggle 对 Python 数据科学的介绍中遇到了这个表达式。我什至很难理解这意味着什么。你怎么能确定这个表达式是真的?
python ×13
boolean ×4
logic ×2
python-2.7 ×2
python-3.x ×2
if-statement ×1
list ×1
nonetype ×1
optimization ×1
sign ×1
time ×1