首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
华为云
V2EX  ›  Python

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

  •  
  •   songdg · 149 天前 · 3500 次点击
    这是一个创建于 149 天前的主题,其中的信息可能已经有所发展或是发生改变。
    要验证 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')
    37 回复  |  直到 2018-05-23 05:56:50 +08:00
        1
    ballshapesdsd   149 天前   ♥ 1
    (''.join('1' if y else '0' for y in b)) in (''.join('1' if x else '0' for x in a))
        2
    widewing   149 天前 via Android
    [x in a for x in b]
        3
    takato   149 天前   ♥ 1
    这不就是 KMP 吗?
        4
    Arnie97   149 天前 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   149 天前
    >>> 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   149 天前
    本质上还是循环,算法复杂度是没变的。
    如果你的需求是求解集合子集,那不允许出现重复元素,直接转换成 set,用 in 判断是否子集
    如果你的需求中包含了元素顺序,那就比较困难了。
        7
    wdc63   149 天前
    @Arnie97 他写反了
        8
    pkookp8   149 天前 via Android
    只能拿 b 的第一个去 a 里找,找对了找 b 的下一个是不是 a 的下一个,直到 b 的结尾都匹配,则 b 在 a 中
    除了循环还能有什么办法
        9
    ipwx   149 天前   ♥ 1
    先引入 rolling_window:

    然后

    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   149 天前
    另外题主,b == a[i:i+3] 这种写法已经 deprecated 了,要用 np.equal
        11
    roy2220   149 天前   ♥ 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   149 天前
    那就递归吧
        13
    Arnie97   149 天前 via Android
    @wdc63 显然需求里包含了元素顺序,不然一共就 True 和 False 两种有啥好判断的
        14
    songdg   149 天前
    @wdc63 这个我知道,只是不想用纯 Python 写循环,又找不到 numpy 有什么函数可用。
        15
    wdc63   149 天前
    @songdg 你的需求决定了你的算法只能是循环决定,难道有现成的 numpy 函数它运行的时候就不需要循环了吗?
        16
    wdc63   149 天前
    @Arnie97 他自己写那段代码就没包含。
        17
    wdc63   149 天前
    @Arnie97 你的意思如果是要打印出每一个 True False 的话那就用[x in b for x in a]
        18
    ipwx   149 天前 via iPhone
    @songdg 不点评我那个实现吗
        19
    ipwx   149 天前 via iPhone
    @wdc63 我那个实现就不用循环
        20
    songdg   149 天前
    @ipwx 谢谢,你那个有点复杂,一时看不懂,不好意思。
        21
    rabbbit   149 天前
    我想到的是''.join(map(str, b)) in ''.join(map(str, a))
    看了下评论,为什么说 1 楼的代码是错的?
        22
    noli   149 天前 via iPhone
    false 为 0
    True 为 1
    bool 数组转换为整型数之后,判断以 b 为模余数是否为 0
    就可以了
        23
    locktionc   149 天前   ♥ 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 中')
    ```
        24
    boboliu   149 天前 via Android
    @locktionc 哈哈哈,这操作很骚…
        25
    Binb   149 天前 via Android
    用字符串匹配喽
        26
    lastpass   149 天前 via Android
    吓得我赶紧去翻了一下编译原理,这就是最简单的有穷自动机呀。
        27
    PythonAnswer   149 天前 via iPhone
    Map reduce filter
        28
    clearCode1124   149 天前
    sets.difference()
        29
    ipwx   148 天前 via iPhone
    @locktionc 如果不是 bool,这招就不管用了
        30
    xxxy   148 天前
    楼上说了,用 kmp 可以实现
        31
    Raymon111111   148 天前
    不就是最长公共子序列吗
        32
    congeec   148 天前 via iPhone
    @ipwx 老哥这些 gist 里的注释和 doc test 都是你手写的么?

    @locktionc 大胸弟你这样会被打死的
        33
    ipwx   148 天前   ♥ 1
    @congeec 这个 gist 不是我写的,是我见过的写得最好的 rolling_window。

    我昨天写的 np.max 其实还不太妥当。用 np.any 其实就够了:

    is_matched = np.any(np.equal(np.sum(needle, axis=-1), l).astype(np.bool))
        34
    locktionc   148 天前
    @ipwx 也管用。
        35
    ipwx   148 天前
    @locktionc 浮点数的话,要用 (a-b) < eps,就用不了你这方法了。

    @congeec 上面的 astype(np.bool) 似乎不必要。
        36
    lolizeppelin   148 天前 via Android
    转 set b-a
        37
    songdg   148 天前
    谢谢各位热心的 v2exer。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2634 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 22ms · UTC 01:00 · PVG 09:00 · LAX 18:00 · JFK 21:00
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1