按索引列表进行字符串切片
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']
您可以进行列表理解,但我认为这会大大降低可读性,因此不是正确的方法。
我有一个列表中存在的长度列表,例如:
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']
您可以进行列表理解,但我认为这会大大降低可读性,因此不是正确的方法。