【问题标题】:Python: Want to use a string as a slice specifierPython:想要使用字符串作为切片说明符
【发布时间】:2012-10-30 17:53:53
【问题描述】:

假设我有一个带有 string "1:3" 的变量 S(或者就此而言,"1",或 "1:"":3"),我想将其用作list L 上的切片说明符。你不能简单地做L[S],因为切片所需的参数是"int:int"

现在,我目前有一些丑陋的代码将 S 解析为其两个组成部分 ints 并处理所有边缘情况(其中 4 个)以提出正确的切片访问,但这只是丑陋的和unpythonic。

如何优雅地获取字符串S 并将其用作我的切片说明符?

【问题讨论】:

    标签: python string slice specifier


    【解决方案1】:

    这可以通过使用列表理解来完成,而无需太多黑客攻击。我们在: 上拆分字符串,将拆分项作为参数传递给slice() 内置函数。这使我们可以在一行中很好地生成切片,这种方式适用于我能想到的所有情况:

    slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])
    

    通过使用 slice() 内置函数,我们巧妙地避免了自己处理太多边缘情况。

    示例用法:

    >>> some_list = [1, 2, 3]
    >>> string_slice = ":2"
    >>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
    [1, 2]
    >>> string_slice = "::-1"
    >>> some_list[slice(*[int(i.strip()) if i else None for i in string_slice.split(":")])]
    [3, 2, 1]
    

    【讨论】:

    • 最好在此处使用拆分而不是分区,就像我为第三个参数所做的那样。
    • 确实,它工作得很好。这一个也非常好地为您提供不正确输入的体面错误(通过向slice() 抱怨额外的操作数)。
    • 虽然这个解决方案有效,但我认为 vivek 的更简洁、更易于理解——这对于有人接管我的代码时很重要。
    【解决方案2】:

    这是另一个解决方案

    eval("L[%s]" % S) 
    

    警告 - It's not safe 如果 S 来自外部(不可靠)来源。

    【讨论】:

    • 您可能想要解释为什么这是一个坏主意(它肯定是)。
    • @user1814892 请,请,请不要这样做。这不是工作的工具,它不安全,速度很慢,这只是一种糟糕的方式。
    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 2012-02-15
    • 1970-01-01
    • 2018-05-12
    • 2020-11-27
    • 2013-10-29
    • 2012-11-03
    相关资源
    最近更新 更多