除了写循环还有什么更好的办法

2018-05-21 18:49:15 +08:00
 songdg
要验证 b 是否在 a 中,除了写循环还有什么更好的办法?
a = array([False, False, False, True, True, True, False, False, False, False, False, False])
b = array([True, True, True])
i = 0
while True:
if np.all(b == a[i:i+3]) == True:
print('match')
break
i += 1
else:
print('no match')
5043 次点击
所在节点    Python
37 条回复
ballshapesdsd
2018-05-21 18:52:37 +08:00
(''.join('1' if y else '0' for y in b)) in (''.join('1' if x else '0' for x in a))
widewing
2018-05-21 18:56:15 +08:00
[x in a for x in b]
takato
2018-05-21 19:08:03 +08:00
这不就是 KMP 吗?
Arnie97
2018-05-21 19:27:53 +08:00
@widewing 你写的这个东西和楼主想实现的功能有任何关系么…

>>> a = [0, 1]
>>> b = [1, 1, 1, 1, 1]
>>> [x in a for x in b]
[True, True, True, True, True]
wdc63
2018-05-21 20:33:47 +08:00
>>> from numpy import *
>>> a = array([False, False, False, True, True, True, False, False, False, False, False, False])
>>> b = array([True, True, True])
>>> [ i for i in b if i not in a ]
[]
>>> b = array([True, True, 123])
>>> [ i for i in b if i not in a ]
[123]

空集为真,非空集为假
wdc63
2018-05-21 20:37:04 +08:00
本质上还是循环,算法复杂度是没变的。
如果你的需求是求解集合子集,那不允许出现重复元素,直接转换成 set,用 in 判断是否子集
如果你的需求中包含了元素顺序,那就比较困难了。
wdc63
2018-05-21 20:47:27 +08:00
@Arnie97 他写反了
pkookp8
2018-05-21 20:50:19 +08:00
只能拿 b 的第一个去 a 里找,找对了找 b 的下一个是不是 a 的下一个,直到 b 的结尾都匹配,则 b 在 a 中
除了循环还能有什么办法
ipwx
2018-05-21 20:51:47 +08:00
先引入 rolling_window: https://gist.github.com/seberg/3866040

然后

import numpy as np

a = np.array([False, False, False, True, True, True, False, False, False, False, False, False])
b = np.array([True, True, True])

l = b.shape[0]
needle = np.equal(rolling_window(a, l), b)
is_matched = np.max(np.sum(needle, axis=-1)) == l
ipwx
2018-05-21 20:55:11 +08:00
另外题主,b == a[i:i+3] 这种写法已经 deprecated 了,要用 np.equal
roy2220
2018-05-21 21:30:03 +08:00
我来偷个懒:
a = bytes([False, False, False, True, True, True, False, False, False, False, False, False])
b = bytes([True, True, True])
match = a.find(b) >= 0
print(match)
lyusantu
2018-05-21 21:43:03 +08:00
那就递归吧
Arnie97
2018-05-21 22:24:01 +08:00
@wdc63 显然需求里包含了元素顺序,不然一共就 True 和 False 两种有啥好判断的
songdg
2018-05-21 22:31:38 +08:00
@wdc63 这个我知道,只是不想用纯 Python 写循环,又找不到 numpy 有什么函数可用。
wdc63
2018-05-21 23:11:18 +08:00
@songdg 你的需求决定了你的算法只能是循环决定,难道有现成的 numpy 函数它运行的时候就不需要循环了吗?
wdc63
2018-05-21 23:12:03 +08:00
@Arnie97 他自己写那段代码就没包含。
wdc63
2018-05-21 23:13:52 +08:00
@Arnie97 你的意思如果是要打印出每一个 True False 的话那就用[x in b for x in a]
ipwx
2018-05-22 00:34:53 +08:00
@songdg 不点评我那个实现吗
ipwx
2018-05-22 00:35:06 +08:00
@wdc63 我那个实现就不用循环
songdg
2018-05-22 00:58:17 +08:00
@ipwx 谢谢,你那个有点复杂,一时看不懂,不好意思。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/456605

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX