我有一个字符串列表,我需要以通用方式基于它们的索引列表从列表中子集化
indx=[0,5,7] # index list
a = ['a', 'b', 3, 4, 'd', 6, 7, 8]
我需要在第一次迭代中以通用方式获取子集:
a[0:5]
第二次迭代:
a[5:7]
第三次迭代:
a[7:]
我尝试过的代码:
for i in indx:
if len(indx)==i:
print(a[i:])
else:
print(a[i:i+1])
预期输出:
a[0:5]=='a', 'b', 3, 4, 'd'
a[5:7]=6, 7
a[7:]=8
答案 0 :(得分:3)
使用理解力:
>>> [a[x:y] for x,y in zip(indx,[*indx[1:], None])]
[['a', 'b', 3, 4, 'd'], [6, 7], [8]]
答案 1 :(得分:0)
results = [a[indx[i]:indx[i+1]] for i in range(len(indx)-1)]
将返回一个包含所需3个列表的列表。
答案 2 :(得分:0)
您可以尝试以下方法:
indx.append(len(a))
print(*[a[i:j] for i,j in zip(indx, indx[1:])], sep='\n')
输出:
['a', 'b', 3, 4, 'd']
[6, 7]
[8]
答案 3 :(得分:0)
您认为一次迭代两个项目是正确的,但是问题是for i in lst
不使用索引,并且会失败。
一种迭代并获取两项的方法是使用zip。
indx=[0,5,7] # index list
a = ['a', 'b', 3, 4, 'd', 6, 7, 8]
if indx[0] != 0:
indx = [0] + indx #fixes left indexing in case 0 is not present
if indx[-1] != len(a):
indx += [len(a)] #fixes right indexing to make sure you get all values from the list.
print(indx) #[0, 5, 7, 8]
for left, right in zip(indx, indx[1:]):
print(a[left: right])
#Output:
['a', 'b', 3, 4, 'd']
[6, 7]
[8]
答案 4 :(得分:0)
你在这里。
for i in range(len(indx)):
try:
print("a[%s:%s] ==" % (indx[i], indx[i + 1]) + " ", end=" ")
print(a[indx[i]:indx[i + 1]])
except IndexError:
print("a[%s:] ==" % (indx[i]) + " ", end=" ")
print(a[indx[i]:])
输出:
a[0:5] == ['a', 'b', 3, 4, 'd']
a[5:7] == [6, 7]
a[7:] == [8]
答案 5 :(得分:0)
您可以使用slice
类型将索引列表转换为列表切片。正如其他人已经发布的那样,使用zip
创建开始完成对:
>>> print(list(zip(indx, indx[1:]+[None])))
[(0, 5), (5, 7), (7, None)]
我们使用这些对来定义切片:
>>> slices = [slice(a, b) for a, b in zip(indx, indx[1:]+[None])]
然后使用切片对象,就像使用整数索引一样,但是切片将按照切片开始-完成对中的定义选择列表子字符串:
>>> for slc in slices:
... print(a[slc])
礼物:
['a', 'b', 3, 4, 'd']
[6, 7]
[8]