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

2019-05-08 17:30:31 +08:00
 AILOVEU

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. 针对缘由的问题,能处理语音的也可以,但尽量不要用第三方的语音处理库,有些功能它们没有所以才自己写的

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

2822 次点击
所在节点    Python
10 条回复
Ediacaran
2019-05-08 17:34:20 +08:00
Numpy 修改维度为 2*N
然后再取
Cooky
2019-05-08 17:50:39 +08:00
[ n for i, n in enumerate (list) if 0 <(i+1)%4 < 3 ]
差不多就这样
AILOVEU
2019-05-08 18:00:46 +08:00
@Cooky 其实我的问题用字符串表示更确切些,即“ string ”变成“ stng ”。当然字符串这样比喻也只是为了方便说明,最最最终是 b'xxx',这种的截取
rickygao
2019-05-08 18:12:40 +08:00
chunked + flatmap
sunwei0325
2019-05-08 18:17:01 +08:00
ipwx
2019-05-08 18:19:35 +08:00
np.array(num_list).reshape([-1,2])[::2].reshape([-1])
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
2019-05-08 18:23:15 +08:00
@AILOVEU 同样适用于 bytes
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
2019-05-09 09:19:27 +08:00
reduce(lambda x,y: x + list(y), zip(num_list[::4], num_list[1::4]), [])

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

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

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

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

© 2021 V2EX