相关疑难解决方法(0)

从与条件匹配的iterable中获取第一个项目

我想从符合条件的列表中获取第一项.重要的是,生成的方法不会处理整个列表,这可能非常大.例如,以下功能就足够了:

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)

但是,我想不出一个好的内置/单线来让我这样做.如果我不需要,我不特别想复制这个功能.是否有内置方法可以使第一个项目符合条件?

python iterator

264
推荐指数
11
解决办法
15万
查看次数

Python在列表中找到非零数字的第一个实例

我有这样的清单

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 list

30
推荐指数
5
解决办法
3万
查看次数

在Python中查找满足谓词的元素的索引

我正在寻找 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

12
推荐指数
1
解决办法
4362
查看次数

它是pythonic:命名lambdas

我开始意识到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吗?我应该吮吸它并定义一个单独的功能吗?

编辑

可能值得链接功能内部功能.

python lambda

9
推荐指数
2
解决办法
3914
查看次数

我想在python中删除开头和结尾但不中间长度为1的所有列表

给定一个列表列表(即嵌套列表),我想从外部列表的开头和结尾删除所有长度为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。我想对列表的末尾执行相同的操作。

python list

7
推荐指数
1
解决办法
581
查看次数

高效返回数组中第一个满足条件的值的索引

我需要找到满足条件的 1d NumPy 数组或 Pandas 数字系列中第一个值的索引。数组很大,索引可能靠近数组的开头结尾,或者根本不满足条件。我无法提前判断哪个更有可能。如果不满足条件,则返回值应为-1。我考虑了几种方法。

尝试 1

# func(arr) returns a Boolean array
idx = next(iter(np.where(func(arr))[0]), -1)
Run Code Online (Sandbox Code Playgroud)

但这通常太慢了,因为func(arr)整个数组上应用向量化函数而不是在满足条件时停止。具体来说,当条件在数组开始附近满足时,代价是昂贵的。

尝试 2

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,当条件,即一个实例并不满足。

尝试 3

# func(arr) returns a Boolean …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy pandas

5
推荐指数
1
解决办法
2283
查看次数

标签 统计

python ×6

list ×2

arrays ×1

iterator ×1

lambda ×1

numpy ×1

pandas ×1

performance ×1