【问题标题】:list comprehension and repeated inner reference列表理解和重复的内部引用
【发布时间】:2017-06-01 09:11:17
【问题描述】:

我想根据正则表达式的识别重新格式化文本。

所以我基本上做了

regex= re.compile("(group1)(group2)(group3)(group4)")
text_groups=regex.search(text).groups()

text_groups 是一个带有封闭组的列表。 我想以不断的方式改变顺序。 我知道我可以做到这一点

reordered_groups=np.array(text_groups)[[1,3,0]

但这不是我的问题。

为了避免转换为 np.array 会因为涉及字符串而导致计算效率低下,我更喜欢使用列表推导式,其额外的优势是能够根据条件进行过滤:

reordered_groups=[ text_groups[i] if text_groups[i] is not None else "" for i in [2, 4, 1, 5] ]

我认为 text_groups[i] repeat 很难看,如果您考虑在大型列表上使用类似的技术,可能效率低下,因为您将调用索引两次。我们如何在不使用本身效率低下的 for 循环的情况下避免这种情况?

【问题讨论】:

    标签: python scope list-comprehension variable-assignment


    【解决方案1】:

    您想使用or - 当text_groups[i]None 时,or 将返回语句的右侧,因此您可以这样做:

    reordered_groups = [text_groups[i] or '' for i in [2, 4, 1, 5]]
    

    例如:

    text_groups = ['e', None, 'c', 'f', 'x', None]
    reordered_groups = [text_groups[i] or '' for i in [2, 4, 1, 5]]
    

    返回:

    ['c', 'x', '', '']
    

    【讨论】:

    • 我纠正了我在关于条件语句的列表理解中的错误,但这太棒了!我什至不知道这个关键字有这样的属性。非常感谢!
    • @stackoverflow.com/users/5309300/asongtoruin 如果测试不是被调用的变量为无,您知道如何进行吗? (例如,如果 len 比 5 长?)。顺便说一句,你怎么知道 or 的这种特殊行为,它与预期的布尔比较相去甚远?谢谢
    • @AndoJurai 我不确定你的意思,抱歉。你能举个例子吗?
    • 关于运营商,是关于Python deals with boolean operators的方式
    • 好吧,你不能得到None 元素的len,所以如果你的列表中还有None,那你就有问题了。
    猜你喜欢
    • 2016-05-02
    • 2015-10-28
    • 2014-03-14
    • 2018-02-06
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多