-1

我有一个布尔值列表,例如

l = [False, False, False, True, True, True, False, False, True, False, False]

并且想要反转每个边缘False

[True, True, True, True, True, True, False, False, True, True, True]

实现这一目标的最pythonic方法是什么?

4

4 回答 4

5

可能有一些聪明的单线解决方案,但在有人想出它之前,这里有一种方法可以用老式迭代来做到这一点:

seq = [False, False, False, True, True, True, False, False, True, False, False]

for i in range(len(seq)):
    if seq[i]:
        break
    seq[i] = True

for i in range(len(seq)-1, -1, -1):
    if seq[i]:
        break
    seq[i] = True

print(seq)

结果:

[True, True, True, True, True, True, False, False, True, True, True]
于 2018-07-30T15:32:23.257 回答
2

您可以使用几个生成器表达式,然后使用 NumPy 进行矢量化切片。

这个想法是从列表的开头和结尾分别计算第一个索引,其中值为True。然后使用高效的 NumPy 切片来更新相关元素。

L = [False, False, False, True, True, True, False, False, True, False, False]

idx1 = next(i for i, j in enumerate(L) if j)
idx2 = next(i for i, j in enumerate(L[::-1]) if j)

print(idx1, idx2)  # 3 2

import numpy as np

A = np.array(L)
A[:idx1] = True
A[len(A)-idx2:] = True

print(A)

array([ True,  True,  True,  True,  True,  True, False, False,  True,
        True,  True], dtype=bool)
于 2018-07-30T16:04:18.187 回答
0

我建议您使用以下简单代码:

myList = [False, False, False, True, True, True, False, False, True, False, False]

tempList = myList[:]

# Iterate from the beginning (and invert) until the element differs from the first one
for i,v in enumerate(tempList):
    if v == tempList[0]: myList[i] = not v
    else:                break

# Iterate from the end (and invert) until the element differs from the last one
for i,v in reversed(list(enumerate(tempList))):
    if v == tempList[-1]: myList[i] = not v
    else:                 break

print(myList)
# [True, True, True, True, True, True, False, False, True, True, True]
于 2018-07-30T15:39:04.837 回答
0

根据其他答案的逻辑,这是使用numpy.where的解决方案。

import numpy as np

l = [False, False, False, True, True, True, False, False, True, False, False]

l = np.array(l)
ind = np.where(l)[0]
first, last = ind[0], ind[-1]

l[:first] = True
l[last + 1:] = True

print(l)

这是受到NPEhttps://stackoverflow.com/a/9537766/2611995中的回答的启发。

于 2018-07-31T12:38:42.077 回答