V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
AILOVEU
V2EX  ›  Python

[ Python ] 如何遍历列表中的元素,得到一定规律元素的新列表?

  •  
  •   AILOVEU · 2019-05-08 17:30:31 +08:00 · 2995 次点击
    这是一个创建于 2029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    E6cq8e.png

    num_list = [1,2,3,4,5,6,7,8]
    #怎么处理 num_list,使得按图片中,隔两个取两个
    half_num_list = [1,2,5,6]
    

    使用 num_list[::2],只能得到[1,3,5,7]这种,不满足需求

    为了不让大家解决 xy 问题,我把问题的缘由说一下: 在处理 wav 语音的时候,需要降采样率,16k->8k,采样精度为 16bit 不变。 想要获取降完采样率语音的 data 部分,可以用下面的方法,所以说实现是没有问题的。

    #伪代码
    #f1 是 16k 采样率的文件
    f1.seek(0,0)
    while True:
        data = f1.read(2)
        f2.write(data)
        data = f1.read(2)
    #f2 是 8k 采样率的文件
    

    但是我需要把 f2 的 data 传给另外一个参数,用这种方式不是很 pythonic,就想问下列表怎么操作?

    总的来说两个方面:

    1. 能解决最开始的问题做好,我对实现比较感兴趣
    2. 针对缘由的问题,能处理语音的也可以,但尽量不要用第三方的语音处理库,有些功能它们没有所以才自己写的

    写完之后感觉有些地方没说明白,大家帮忙讨论下吧,或许我就有思虑了

    10 条回复    2019-05-09 09:19:27 +08:00
    Ediacaran
        1
    Ediacaran  
       2019-05-08 17:34:20 +08:00 via iPhone
    Numpy 修改维度为 2*N
    然后再取
    Cooky
        2
    Cooky  
       2019-05-08 17:50:39 +08:00 via Android   ❤️ 2
    [ n for i, n in enumerate (list) if 0 <(i+1)%4 < 3 ]
    差不多就这样
    AILOVEU
        3
    AILOVEU  
    OP
       2019-05-08 18:00:46 +08:00
    @Cooky 其实我的问题用字符串表示更确切些,即“ string ”变成“ stng ”。当然字符串这样比喻也只是为了方便说明,最最最终是 b'xxx',这种的截取
    rickygao
        4
    rickygao  
       2019-05-08 18:12:40 +08:00 via Android
    chunked + flatmap
    sunwei0325
        5
    sunwei0325  
       2019-05-08 18:17:01 +08:00
    ipwx
        6
    ipwx  
       2019-05-08 18:19:35 +08:00
    np.array(num_list).reshape([-1,2])[::2].reshape([-1])
    ipwx
        7
    ipwx  
       2019-05-08 18:22:41 +08:00
    对于 bytes:

    >>> np.frombuffer(b'string', dtype=np.uint8).reshape([-1,2])[::2].reshape([-1]).tobytes()
    b'stng'
    Cooky
        8
    Cooky  
       2019-05-08 18:23:15 +08:00 via Android
    @AILOVEU 同样适用于 bytes
    cissoid
        9
    cissoid  
       2019-05-08 18:31:59 +08:00
    >>> from itertools import compress, cycle
    >>> list(compress(range(1, 9), cycle([1,1,0,0])))
    [1, 2, 5, 6]
    wizardoz
        10
    wizardoz  
       2019-05-09 09:19:27 +08:00
    reduce(lambda x,y: x + list(y), zip(num_list[::4], num_list[1::4]), [])
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2829 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:24 · PVG 08:24 · LAX 16:24 · JFK 19:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.