Python中如何遍历列表并按照特定规律筛选元素生成新列表?

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

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


Python中如何遍历列表并按照特定规律筛选元素生成新列表?

11 回复

Numpy 修改维度为 2*N
然后再取


# 假设你要从列表中筛选出所有偶数并生成新列表
original_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 方法1:列表推导式(最简洁)
even_numbers = [x for x in original_list if x % 2 == 0]
print(even_numbers)  # 输出: [2, 4, 6, 8, 10]

# 方法2:filter()函数配合lambda
even_numbers_filter = list(filter(lambda x: x % 2 == 0, original_list))
print(even_numbers_filter)  # 输出: [2, 4, 6, 8, 10]

# 方法3:普通for循环(最直观)
even_numbers_loop = []
for num in original_list:
    if num % 2 == 0:
        even_numbers_loop.append(num)
print(even_numbers_loop)  # 输出: [2, 4, 6, 8, 10]

# 复杂筛选示例:筛选能被3整除且大于5的数
complex_filter = [x for x in original_list if x % 3 == 0 and x > 5]
print(complex_filter)  # 输出: [6, 9]

核心就这几种方式,列表推导式最常用。

[ n for i, n in enumerate (list) if 0 <(i+1)%4 < 3 ]
差不多就这样

其实我的问题用字符串表示更确切些,即“ string ”变成“ stng ”。当然字符串这样比喻也只是为了方便说明,最最最终是 b’xxx’,这种的截取

chunked + flatmap

np.array(num_list).reshape([-1,2])[::2].reshape([-1])

对于 bytes:

>>> np.frombuffer(b’string’, dtype=np.uint8).reshape([-1,2])[::2].reshape([-1]).tobytes()
b’stng’

同样适用于 bytes

>>> from itertools import compress, cycle
>>> list(compress(range(1, 9), cycle([1,1,0,0])))
[1, 2, 5, 6]

reduce(lambda x,y: x + list(y), zip(num_list[::4], num_list[1::4]), [])

回到顶部