【问题标题】:Python list slicing with string argument带有字符串参数的 Python 列表切片
【发布时间】:2016-07-21 03:51:07
【问题描述】:

可以像这样对 python 列表进行切片:

>>> list=['a', 'b']
>>> list[0:1]
['a']

但是,将索引作为字符串传递时,会抛出错误:

>>> index="0:1"
>>> list[index]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str

如何将列表索引指定为字符串? list[0:1] 中的 0:1 到底是什么数据类型?

【问题讨论】:

  • 您应该使用两个整数作为开始和停止索引,然后使用它们。
  • 从traceback可以看出,“列表索引必须是整数,而不是str”

标签: python


【解决方案1】:

n:mslice 的语法糖。您可以split 您的索引字符串,将其部分转换为整数,然后从中创建一个slice

>>> lst = list(range(10))
>>> index = "1:4"
>>> s = slice(*map(int, index.split(':')))
>>> lst[s]
[1, 2, 3]

三个部分的工作原理相同:

>>> index = "1:9:2"
>>> s = slice(*map(int, index.split(':')))
>>> lst[s]
[1, 3, 5, 7]

如果您想允许“空白”部分,则转换会涉及更多:

>>> index = "::-1"
>>> s = slice(*[int(x) if x else None for x in index.split(':')])
>>> lst[s]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

【讨论】:

  • @tobias_k...切片 range 将在 Python3 中产生 range 而不是 list,如果我错了,请纠正我?
  • @IronFist 你是对的,在 Python2 中试过这个;转换为list,因此它适用于两者。
【解决方案2】:

为什么不通过在: 上拆分将您的 slicing 字符串转换为整数,然后将它们用作切片索引。

list=['a', 'b']
slicer_str = '0:1'
slicer_int = [int(i) for i in slicer_str.split(':')]
print(list[slicer_int[0]:slicer_int[1]])

【讨论】:

  • 在这种情况下,slicer_str::1 会发生什么情况?
  • @Zulakis 如果这种切片器恰好出现在您的情况下,您可以按照 tobias_k 的建议使用 map 和 slice。这将处理所有此类情况。
【解决方案3】:

您可以为此使用exec()

l = ['a', 'b']
index="0:1"
exec('print(l[{}])'.format(index))

只需要打印来查看输出。您可以将其分配给一个变量,然后再调用该变量。

【讨论】:

  • 如果没有print,即要将结果分配给某个变量,您应该使用eval 而不是exec。此外,如果有帮助,切勿使用eval(或exec)。
  • exec('a = l[{}]'.format(index)) 也会分配给a
  • 对,但是这样你就不能将丑陋的 exec/eval 部分包装到一个函数中。
  • 是的,你是对的。但在这种特殊情况下,不涉及任何功能。从理论上讲,您可以在 exec() 中将 a 作为全局变量,甚至在函数内部也可以将其继承,这将是超级丑陋的。
【解决方案4】:

在你指定起点和终点的地方使用[:],这样你就可以很容易地追踪你想要切片的地方

【讨论】:

  • 我相信上述答案不适合所提出的问题。 Mark等提供的cmets足以解决问题。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2017-02-15
  • 2023-04-09
  • 2022-11-23
相关资源
最近更新 更多