我正在寻找一种方法来轻松确定列表中的所有非None项是否出现在单个连续切片中. 我将使用整数作为非None项的示例.
例如,该列表[None, None, 1, 2, 3, None, None]符合我对连续整数条目的要求.与此相反,[1, 2, None, None, 3, None]是不连续的,因为有整数之间无条目.
还有一些例子可以说明这一点.
连续:
[1, 2, 3, None, None]
[None, None, 1, 2, 3]
[None, 1, 2, 3, None]
不连续:
[None, 1, None, 2, None, 3]
[None, None, 1, None, 2, 3]
[1, 2, None, 3, None, None]
我的第一种方法是使用变量来跟踪我们是否遇到了一个问题None,以及我们是否遇到了一个问题int- 这最终导致了一个高度嵌套且非常难以遵循的if/else系列嵌入在for循环中的语句.(除了丑陋之外,我承认在每种情况下都没有让它工作).
任何人都知道一种更简单的方法来确定列表中的非None项是否出现在单个连续切片中?
我很想知道它们之间有什么区别
all and "and"
any and "or"
Run Code Online (Sandbox Code Playgroud)
例如:status1 = 100,status2 = 300,status3 = 400
哪个更好用:
if status1==100 and status2 ==300 and status3 ==400:
Run Code Online (Sandbox Code Playgroud)
要么
if all([status1==100,status2==300,status3=400]):
Run Code Online (Sandbox Code Playgroud)
同样适用于任何和/或条件:
if status1==100 or status2 ==300 or status3==400:
or
if any([status1==100, status2 ==300, status3==400])
Run Code Online (Sandbox Code Playgroud)
哪一个更有效率,使用内置函数或原语或和条件?
在 Python 中,可以通过用加法或乘法运算符折叠列表来优雅地完成对大量数字的加法或乘法:
import functools, operator
lst = range(1,100)
sum = functools.reduce(operator.add, lst)
prod = functools.reduce(operator.mul, lst)
Run Code Online (Sandbox Code Playgroud)
+这需要运算符和的等价函数,它们分别由运算符模块*提供为
和。operator.addoperator.mul
如果我想对运算符使用相同的习惯用法or:
ingredients = ['onion', 'celery', 'cyanide', 'chicken stock']
soup_is_poisonous = functools.reduce(operator.or, map(is_poisonous, ingredients))
Run Code Online (Sandbox Code Playgroud)
...然后我发现operator没有相当于逻辑and和or运算符的函数(尽管它有一个逻辑运算符not)
当然,我可以简单地写一个有效的:
def operator_or(x,y):
return x or y
Run Code Online (Sandbox Code Playgroud)
但我想知道:为什么没有operator.or和operator.and?operator按位and和or存在,但不是逻辑的。
当然,这只是一个小烦恼,答案很可能与缺失的恒等函数相同:很容易编写一个。但这同样适用*,+那么为什么会有差异呢?
我希望使用Python all()函数来帮助我计算某些东西,但是如果all()它没有在它命中时就进行评估,那么这个东西可能会花费更长的时间False.我想它可能是短路评估,但我只是想确定.另外,有没有办法告诉Python如何评估函数?
我正在编写一个脚本,我必须根据许多条件测试数字.如果满足任何条件,我想返回True,我想以最快的方式做到这一点.
我的第一个想法是使用any()而不是嵌套if语句或多个or链接我的条件.因为我会满意,如果任何条件是True我真的可以从any()懒惰和尽快返回真正受益.
基于以下事实:以下打印立即发生而不是在10(= 0 + 1 + 2 + 3 + 4)秒之后,我认为是.是这样的,还是我错了?
import time
def some(sec):
time.sleep(sec)
return True
print(any(some(x) for x in range(5)))
Run Code Online (Sandbox Code Playgroud) 我发现了一个有趣的性能优化.而不是使用all():
def matches(self, item):
return all(c.applies(item) for c in self.conditions)
Run Code Online (Sandbox Code Playgroud)
我已经分析过使用循环时它会更快:
def matches(self, item):
for condition in self.conditions:
if not condition.applies(item):
return False
return True
Run Code Online (Sandbox Code Playgroud)
随着all()探查器显示1160个额外的<genexpr>呼叫:
4608 function calls (4600 primitive calls) in 0.015 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
580 0.002 0.000 0.008 0.000 rule.py:23(matches)
1160 0.002 0.000 0.005 0.000 rule.py:28(<genexpr>)
Run Code Online (Sandbox Code Playgroud)
使用for循环,没有<genexpr>调用:
2867 function calls (2859 primitive calls) in 0.012 seconds
Ordered by: internal …Run Code Online (Sandbox Code Playgroud) 假设我有一个args通过调用获得的命名空间parser.parse_args(),它解析命令行参数。
如何将此命名空间中的所有变量导入到当前命名空间?
例如
parser.add_argument('-p', '--some_parameter', default=1)
args = parser.parse_args()
# ... code to load all variables defined in the namespace args ...
print some_parameter
Run Code Online (Sandbox Code Playgroud)
我当然可以这样做:
some_parameter = args.some_parameter
Run Code Online (Sandbox Code Playgroud)
但如果我有大量参数,则每个参数都需要这样一行。
是否有另一种方法可以从命名空间导入变量,而不必逐一遍历它们?
PS:from args import *不起作用。
PS2:我知道这是一个不好的做法,但这在某些极端情况下会有所帮助,例如我们在快速构建代码原型和测试时。