按索引列表进行字符串切片

String slicing by index list

我有一个列表中存在的长度列表,例如:

a = [1, 3, 4]

此外,我有一个字符串,其长度恰好是 a 的数字之和,这里是 8,看起来像这样:

s = "01100110"

我正在遍历 a 的长度,每次我都希望 a 中正好存在下 n 位。 所以在这里,这将是三个运行,给我“0”、“110”和“0110”。

是否有一个非常聪明的想法可以有效地做到这一点,例如通过切片? 我脑子里有一些奇怪的复杂方法,但正在寻找更有效的方法。

我想到的一些解决方案:

counter_index = 0
counter_sum = 0

for i in range(len(a)):
   res = s[counter_sum:counter_sum+a[counter_index]
   counter_sum += a[counter_index]
   counter_index += 1
   print(res)

您可以将字符串变成 iterator。然后你可以简单地以给定的块大小继续使用它:

it = iter(s)
["".join(next(it) for _ in range(chunk)) for chunk in a]
# ['0', '110', '0110']

您可以使用 itertools.islice 使它更简洁:

from itertools import islice

it = iter(s)
["".join(islice(it, chunk)) for chunk in a]
['0', '110', '0110']

编辑,因为我最初的回答是错误的。

I = 0 # inital starting index
i = 0 # counter for len(a)
while i < len(a):
    J = sum(a[:i+1]) # second starting index
    print(s[I:J]) # or whatever function you need
    I = J # making starting index for next loop equal to this starting index
    i += 1 # increment counter
0
110
0110

类似下面的内容是可以使用的“切片”解决方案

a = [1, 3, 4]
s = "01100110"
offset = 0
for x in a:
    print(f'{s[offset: offset+x]}')
    offset += x

输出

0
110
0110

这种方法基本上是在每次切片时更新字符串,因此我们可以通过直接使用 a 中的值作为索引值而不是将其添加到现有位置值来获取下一个值。

a = [1, 3, 4]
s = "01100110"
st = s
i = 0
while i < len(a):
    print(st[:a[i]])
    st = st[a[i]:]
    i+=1
 

输出

0
110
0110

我认为最简洁的解决方案是直接遍历 a 中的索引,如下所示:

a = [1, 3, 4]
s = "01100110"
bgn = 0
for i in a:
    end = bgn + i
    # The wanted slice
    print(s[bgn:end])  # 0, 110, 0110
    # The next slice begins where this one left off
    bgn = end

如果您需要结果,可以将它们打包成一个列表:

a = [1, 3, 4]
s = "01100110"
results = []
bgn = 0
for i in a:
    end = bgn + i
    results.append(s[bgn:end])
    bgn = end
print(results)  # ['0', '110', '0110']

您可以进行列表理解,但我认为这会大大降低可读性,因此不是正确的方法。