当前位置: 首页 > 面试题库 >

Python:掩盖列表的优雅高效方法

汪胤
2023-03-14
问题内容

例:

from __future__ import division
import numpy as np

n = 8
"""masking lists"""
lst = range(n)
print lst

# the mask (filter)
msk = [(el>3) and (el<=6) for el in lst]
print msk

# use of the mask
print [lst[i] for i in xrange(len(lst)) if msk[i]]

"""masking arrays"""
ary = np.arange(n)
print ary

# the mask (filter)
msk = (ary>3)&(ary<=6)
print msk

# use of the mask
print ary[msk]                          # very elegant

结果是:

>>> 
[0, 1, 2, 3, 4, 5, 6, 7]
[False, False, False, False, True, True, True, False]
[4, 5, 6]
[0 1 2 3 4 5 6 7]
[False False False False  True  True  True False]
[4 5 6]

如您所见,与列表相比,对数组进行屏蔽的操作更为优雅。如果您尝试使用列表中的数组屏蔽方案,则会收到错误消息:

>>> lst[msk]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: only integer arrays with one element can be converted to an index

问题是要为lists找到一个优雅的蒙版。

更新:
通过jamylak引入的答案,compress但是提出的要点Joel Cornett使解决方案完全符合我的兴趣。

>>> mlist = MaskableList
>>> mlist(lst)[msk]
>>> [4, 5, 6]

问题答案:

你在找
itertools.compress

文档中的示例

相当于:

def compress(data, selectors):
    # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
    return (d for d, s in izip(data, selectors) if s)


 类似资料:
  • 问题内容: 输入: 输出: 什么是最优雅的(阅读:Pythonic)书写方式? 问题答案: 我自己会写一个生成器,但是像这样:

  • 我有一个如下所示的dataframe,但我真正的dataframe有数百万行 我想查找每24小时执行测试的次数(使用测试列标识

  • a = [i for i in range(1, 8000)] 假如有个这样的列表, 我需要把里面的所有值组合 然后求 组合的总和与100差的最小值。 例如 1和2组合 1+2 =3 与100 差 3-100 == -97 , 1和3组合 1+3-100 = -96 , 1和4组合,1+4-100=-95..... 1+99-100=0 ....依次类推, 1+2+3+4+5+6...+7999-

  • 问题内容: 当我用Python编写代码时,经常需要根据某些条件从列表或其他序列类型中删除项目。我还没有找到一种优雅而有效的解决方案,因为从当前正在迭代的列表中删除项目是很糟糕的。例如,您不能执行以下操作: 我通常会做这样的事情: 这是低效的,相当丑陋,甚至可能有错误(它如何处理多个“ John Smith”条目?)。有没有人有一个更优雅的解决方案,或者至少是一个更有效的解决方案? 与字典配合使用的

  • 我希望以优雅的方式缓存来自外部服务的数据:旧数据虽然已过期,但仍在被服务,直到工作人员成功获取新数据。数据不是时间关键型的,但是缺少数据(外部服务关闭)会阻止服务运行,因此使用持久缓存。 目前 > 我将获取时间戳存储在一个单独的Redis密钥中 我无限期地缓存数据,直到工作人员获取新数据(我不设置过期时间) 问题 > 这是使用Redis进行优雅缓存的正确方法吗? 我可以从Redis本机获取密钥更新