1
ballshapesdsd 2018-05-21 18:52:37 +08:00 1
(''.join('1' if y else '0' for y in b)) in (''.join('1' if x else '0' for x in a))
|
2
widewing 2018-05-21 18:56:15 +08:00 via Android
[x in a for x in b]
|
3
takato 2018-05-21 19:08:03 +08:00 1
这不就是 KMP 吗?
|
4
Arnie97 2018-05-21 19:27:53 +08:00 via Android
@widewing 你写的这个东西和楼主想实现的功能有任何关系么…
>>> a = [0, 1] >>> b = [1, 1, 1, 1, 1] >>> [x in a for x in b] [True, True, True, True, True] |
5
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] 空集为真,非空集为假 |
6
wdc63 2018-05-21 20:37:04 +08:00
本质上还是循环,算法复杂度是没变的。
如果你的需求是求解集合子集,那不允许出现重复元素,直接转换成 set,用 in 判断是否子集 如果你的需求中包含了元素顺序,那就比较困难了。 |
8
pkookp8 2018-05-21 20:50:19 +08:00 via Android
只能拿 b 的第一个去 a 里找,找对了找 b 的下一个是不是 a 的下一个,直到 b 的结尾都匹配,则 b 在 a 中
除了循环还能有什么办法 |
9
ipwx 2018-05-21 20:51:47 +08:00 1
先引入 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 |
10
ipwx 2018-05-21 20:55:11 +08:00
另外题主,b == a[i:i+3] 这种写法已经 deprecated 了,要用 np.equal
|
11
roy2220 2018-05-21 21:30:03 +08:00 1
我来偷个懒:
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) |
12
lyusantu 2018-05-21 21:43:03 +08:00
那就递归吧
|
21
rabbbit 2018-05-22 01:05:42 +08:00
我想到的是''.join(map(str, b)) in ''.join(map(str, a))
看了下评论,为什么说 1 楼的代码是错的? |
22
noli 2018-05-22 04:54:38 +08:00 via iPhone
false 为 0
True 为 1 bool 数组转换为整型数之后,判断以 b 为模余数是否为 0 就可以了 |
23
locktionc 2018-05-22 07:08:02 +08:00 2
楼上这这些人,你们怎么一根筋不知道变通?
``` 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]) if str(b)[1:-1] in str(a): print('b 在 a 中') ``` |
25
Binb 2018-05-22 07:56:43 +08:00 via Android
用字符串匹配喽
|
26
lastpass 2018-05-22 08:33:38 +08:00 via Android
吓得我赶紧去翻了一下编译原理,这就是最简单的有穷自动机呀。
|
27
PythonAnswer 2018-05-22 08:36:12 +08:00 via iPhone
Map reduce filter
|
28
clearCode1124 2018-05-22 08:46:26 +08:00
sets.difference()
|
30
xxxy 2018-05-22 10:31:34 +08:00
楼上说了,用 kmp 可以实现
|
31
Raymon111111 2018-05-22 10:47:06 +08:00
不就是最长公共子序列吗
|
32
congeec 2018-05-22 10:50:55 +08:00 via iPhone
|
33
ipwx 2018-05-22 10:58:31 +08:00 1
@congeec 这个 gist 不是我写的,是我见过的写得最好的 rolling_window。
我昨天写的 np.max 其实还不太妥当。用 np.any 其实就够了: is_matched = np.any(np.equal(np.sum(needle, axis=-1), l).astype(np.bool)) |
35
ipwx 2018-05-22 11:12:13 +08:00
|
36
lolizeppelin 2018-05-22 12:16:26 +08:00 via Android
转 set b-a
|
37
songdg OP 谢谢各位热心的 v2exer。
|