как получить подмножество списка из индекса списка в Python - PullRequest
1 голос
/ 02 мая 2019

У меня был список строк, мне нужно поднабор из списка на основе общего списка их индексов

indx=[0,5,7] # index list

a = ['a', 'b', 3, 4, 'd', 6, 7, 8]

Мне нужно получить подмножества в общем виде в первой итерации:

a[0:5]

2-я итерация:

a[5:7]

3-я итерация:

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

Ответы [ 6 ]

3 голосов
/ 02 мая 2019

Используйте понимание:

>>> [a[x:y] for x,y in zip(indx,[*indx[1:], None])]
[['a', 'b', 3, 4, 'd'], [6, 7], [8]]
0 голосов
/ 06 мая 2019

Вы можете использовать тип 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]
0 голосов
/ 02 мая 2019

Вот, пожалуйста.

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]
0 голосов
/ 02 мая 2019

Вы были правы, думая об итерациях по двум элементам одновременно, но проблема в том, что 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]
0 голосов
/ 02 мая 2019

Вы можете попробовать это:

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]
0 голосов
/ 02 мая 2019
results = [a[indx[i]:indx[i+1]] for i in range(len(indx)-1)]

Вернет список, содержащий 3 списка, которые вы хотите.

...