>我有这样的列表:
index A B
0 false true
1 false false
2 true false
3 false false
4 false false
5 false false
6 true false
7 false false
8 false true
9 false false
10 false false
11 true false
12 false false
我需要的输出是(2,8(
逻辑是,一旦在 A 中检测到 true,我将在 B 中寻找下一个 true,而忽略 A 中的任何其他 true。
在实践中,它会这样做:
index A B
0 false true // ignore the true in B
1 false false
2 true false <- start
3 false false
4 false false
5 false false
6 true false // ignore the true in A
7 false false
8 false true <- end
9 false false
10 false false
11 true false <- start again
12 false false
所以我可以在循环中完成(伪代码(:
for i in a.index:
for j in b.index[i + 1:]:
if b[j]:
# write i and j somewhere
i = j
break
它是伪代码,因为 i = j 行不起作用
有没有熊猫式的解决方案来实现这一点?
这与我之前的问题非常相似(通过比较两列来跟踪 Pandas 中的状态反转(,但主要区别在于,一旦检测到开始("A"列(,我想忽略所有这些,直到有一个停止("B"列(
到目前为止,我发现的最快的"循环"解决方案是:
i = 0
while i < len(A):
start = A[i:].idxmax()
stop = B[start + 1:].idxmax()
print(start, stop)
i = stop
a = [False, True, False, True]
b = [True, False, False, True]
if True in a:
aNum = a.index(True)
bNum = b[aNum:].index(True) + aNum if True in b[aNum:] else None
else:
aNum = None
bNum = None
print((aNum, bNum))
输出
(1, 3)
修改上一个答案以允许继续:
def getNextPair(aTotal, bTotal):
curPos = 0
while True:
a = aTotal[curPos:]
b = bTotal[curPos:]
if True in a:
aNum = a.index(True)
bNum = b[aNum:].index(True) + aNum if True in b[aNum:] else None
if aNum is not None:
aNum += curPos
if bNum is not None:
bNum += curPos
else:
aNum = None
bNum = None
if aNum is not None or bNum is not None:
yield((aNum, bNum))
if bNum is None:
break
curPos = bNum + 1
a = [False, True, False, True, True, True, False, False, True, True]
b = [True, False, False, False, True, False, True, True, False, True]
for startStop in getNextPair(a, b):
print(startStop)
输出
(1, 4)
(5, 6)
(8, 9)