我想从符合条件的列表中获取第一项.重要的是,生成的方法不会处理整个列表,这可能非常大.例如,以下功能就足够了:
def first(the_iterable, condition = lambda x: True):
for i in the_iterable:
if condition(i):
return i
Run Code Online (Sandbox Code Playgroud)
这个函数可以用这样的东西:
>>> first(range(10))
0
>>> first(range(10), lambda i: i > 3)
4
Run Code Online (Sandbox Code Playgroud)
但是,我想不出一个好的内置/单线来让我这样做.如果我不需要,我不特别想复制这个功能.是否有内置方法可以使第一个项目符合条件?
我有这样的清单
myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
Run Code Online (Sandbox Code Playgroud)
我想找到列表中第一个数字的位置,该位置不等于零.
myList.index(2.0)
Run Code Online (Sandbox Code Playgroud)
适用于此示例,但有时第一个非零数字将为1或3.
有这么快的方法吗?
我正在寻找 Python 中的内置/库函数或方法,用于在列表中搜索满足谓词的特定元素并返回索引。我正在寻找一个内置函数,因为我觉得这应该在 Python 库中。
它类似于,eg[(10, 1), (20, 2), (30, 3)].index((30, 3))
返回 2,但我想要一个自定义比较函数,例如,我只想匹配前面示例中元组的第一个元素。
我正在寻找的函数本质上是这样做的:
def custom_index(l, f):
for i, e in enumerate(l):
if f(e): return i
return -1 # or something else to indicate not found
Run Code Online (Sandbox Code Playgroud)
用法:
custom_index([(10, 1), (20, 2), (30, 3)], lambda x: x[0]==30) -> returns 2
Run Code Online (Sandbox Code Playgroud) 我开始意识到python中lambda表达式的价值,特别是涉及函数式编程map
,函数返回函数等等.但是,我也一直在函数中命名lambdas,因为:
当我遇到满足上述标准的情况时,我一直在编写一个名为lambda的表达式,以便干燥并缩小范围功能.例如,我正在编写一个在某些numpy
数组上运行的函数,我需要对传递给函数的所有数组进行适度的繁琐索引(可以很容易地放在一行上).我编写了一个名为lambda的表达式来进行索引,而不是编写整个其他函数,或者在整个函数定义中多次复制/粘贴索引.
def fcn_operating_on_arrays(array0, array1):
indexer = lambda a0, a1, idx: a0[idx] + a1[idx]
# codecodecode
indexed = indexer(array0, array1, indices)
# codecodecode in which other arrays are created and require `indexer`
return the_answer
Run Code Online (Sandbox Code Playgroud)
这是滥用python的lambdas吗?我应该吮吸它并定义一个单独的功能吗?
可能值得链接功能内部功能.
给定一个列表列表(即嵌套列表),我想从外部列表的开头和结尾删除所有长度为1的内部列表。例如
d = [[3], [1,5], [3], [3,2,4], [8], [3]]
应该变成:[1,5], [3], [3,2,4]
。
对于列表的开头,我使用以下代码:
i = 0
while len(d[i]) == 1:
d.remove(d[i])
n = n -1
Run Code Online (Sandbox Code Playgroud)
最后,我使用以下代码:
while len(d[n-1]) == 1:
d.remove(d[n-1])
n = n - 1
Run Code Online (Sandbox Code Playgroud)
其中 n = 列表数。
当我运行这个时,我得到:
[[1, 5], [3, 2, 4]]
Run Code Online (Sandbox Code Playgroud)
所以它还删除了中间长度为 1 的列表。我怎样才能更改代码以使其不这样做?
因此,对于许多n
列表,我想删除开头的所有长度为 1 的列表,直到有一个列表的长度不为 1。我想对列表的末尾执行相同的操作。
我需要找到满足条件的 1d NumPy 数组或 Pandas 数字系列中第一个值的索引。数组很大,索引可能靠近数组的开头或结尾,或者根本不满足条件。我无法提前判断哪个更有可能。如果不满足条件,则返回值应为-1
。我考虑了几种方法。
# func(arr) returns a Boolean array
idx = next(iter(np.where(func(arr))[0]), -1)
Run Code Online (Sandbox Code Playgroud)
但这通常太慢了,因为func(arr)
在整个数组上应用向量化函数而不是在满足条件时停止。具体来说,当条件在数组开始附近满足时,代价是昂贵的。
np.argmax
稍微快一点,但无法识别何时从未满足条件:
np.random.seed(0)
arr = np.random.rand(10**7)
assert next(iter(np.where(arr > 0.999999)[0]), -1) == np.argmax(arr > 0.999999)
%timeit next(iter(np.where(arr > 0.999999)[0]), -1) # 21.2 ms
%timeit np.argmax(arr > 0.999999) # 17.7 ms
Run Code Online (Sandbox Code Playgroud)
np.argmax(arr > 1.0)
返回0
,当条件,即一个实例并不满足。
# func(arr) returns a Boolean …
Run Code Online (Sandbox Code Playgroud)