【问题标题】:How do you use a variable as an index when slicing strings in Python?在 Python 中切片字符串时如何使用变量作为索引?
【发布时间】:2011-11-29 07:59:30
【问题描述】:

我一直在尝试使用循环从字符串中切出两个字符,但不是抓取两个字符,而是只抓取一个。

我试过了:

input[i:i+1]

input[i:(i+1)]

但似乎都不起作用。

如何使用变量进行切片?

完整的例程:

def StringTo2ByteList(input):
    # converts data string to a byte list, written for ascii input only
    rlist = []
    for i in range(0, len(input), 2):
        rlist.append(input[i:(i+1)])
    return rlist

【问题讨论】:

  • 注意:input 作为变量名会影响内置函数
  • @wim,没有意识到这一点,谢谢。
  • @wim 在 Python 2 上,它隐藏了一个内置函数您几乎永远不应该使用。我会把它放在idfile 的类别中(即使在标准库中也经常被隐藏)而不是listdict 等。

标签: python string slice


【解决方案1】:

切片值不是切片的开始和结束字符,它们是开始和结束。如果你想分割两个元素,那么你的 stop 必须比你的 start 大 2

input[i:i+2]

【讨论】:

  • 谢谢,效果很好。这肯定是违反直觉的,我必须绕着它转。
  • @eryksun,范围的唯一不那么直观的方面是它不会在stop 处达到最大值,但在小于停止处的最大值处。我终于在 Python 教程中找到了用图表说明他们对切片索引所做的部分,所以我现在很好。
  • 有时将其视为[start:start+size] 而不是[start:stop] 更好。
  • @Ignacio 说对了一半,你的回答把两半放在了大脑里。看我的回答。
【解决方案2】:

记住切片索引的一个好方法是将数字视为元素之间位置的标签。

例如,对ba 进行切片,您将使用fruit[0:2]。以这种方式思考时,事情似乎不再违反直觉,并且您可以轻松避免在代码中出现错误。

【讨论】:

    【解决方案3】:

    当我们进行从左到右的迭代时,根据中间位置进行推理:

    li = [10, 20, 55, 65, 75, 120, 1000]
    print 'forward slicing li[2:5]    ->',li[2:5]
    # prints forward slicing li[2:5]    -> [55, 65, 75] 
    

    因为 pos 2 介于 20 / 55 之间,而 pos 5 介于 75 / 120 之间

    .

    但是当我们进行从右到左的迭代时它不起作用:

    li = [10, 20, 55, 65, 75, 120, 1000]
    print li
    print 'reverse slicing li[5:2:-1] ->',li[5:2:-1]
    # prints reverse slicing li[5:2:-1] -> [120, 75, 65]
    

    我们必须将 li[ 5 : 2 : -1 ] 视为 :
    从元素 li[5]
    (即 120)至未包含的元素 li[2](即 55)
    也就是说
    从元素 li[5](即 120)仅包括 li[3](即 65)。

    .

    这使得反向切片从一开始就很危险:

    li = [10, 20, 55, 65, 75, 120, 1000]
    print li[ -1 : 2  : -1 ]
    # prints [1000, 120, 75, 65] not [120, 75, 65, 55]
    # the same as:
    print li[  None : 2 : -1 ]
    # prints [1000, 120, 75, 65]
    print li[       : 2 : -1 ]
    # prints [1000, 120, 75, 65]
    

    li = [10, 20, 55, 65, 75, 120, 1000]
    print li[ 4 : 0 : -1]
    # prints [75, 65, 55, 20] , not [65, 55, 20, 10]
    

    如果很难这样想,防止错误的方法是写

    print list(reversed(li[2:5]))
    # prints [75, 65, 55]
    print list(reversed(li[2:-1]))
    # prints [120, 75, 65, 55]
    print list(reversed(li[0:4]))
    # prints [65, 55, 20, 10]
    

    请注意,就包含的第一个元素而言,获得反向切片的唯一方法是

    print li[ 4 :      : -1]
    

    代表

    print li[ 4 : None : -1]
    

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2012-03-12
      相关资源
      最近更新 更多