Как получить 2-й список из списка, но форма определена в другом списке - PullRequest
2 голосов
/ 10 мая 2019

Например, у меня есть list как:

a = [143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]

Я хочу изменить его на 2-й list в этой форме:

b = [
    [143, 146, 152],
    [235, 246],
    [468, 476],
    [607, 615],
    [707, 712]
]

или

"143 146 152 
235 246
468 476
607 615
707 712" 

но из list с формой = [3, 2, 2, 2, 2]

Как этого добиться? У меня есть что-то вроде этого:

devu = ''
for i in b:
    for j in range(i):
        devu += str(b[j])

devu += ' '
print(devu)

Но получил результат как:

143146152 143146 143146 143146 143146 

Ответы [ 6 ]

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

Если вы работаете со стеком данных (например, pandas)

>>> pd.Series(a).groupby(np.repeat(np.arange(len(s)),s)).agg(list).tolist()

[[143, 146, 152], [235, 246], [468, 476], [607, 615], [707, 712]]
1 голос
/ 10 мая 2019

Вы можете использовать накопление (из itertools) для вычисления начальных и конечных индексов поддиапазонов для извлечения:

a     = [143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]
shape = [3,2,2,2,2]

from itertools import accumulate
b = [ a[s:e] for s,e in zip(accumulate([0]+shape),accumulate(shape)) ]

print(b) # [[143, 146, 152], [235, 246], [468, 476], [607, 615], [707, 712]]

Вы также можете сделать это с помощью Reduction от functools (но это будет работать намного медленнее):

from functools import reduce
b = reduce(lambda b,s: b[:-1]+[b[-1][:s],b[-1][s:]], shape, [a])[:len(shape)]
1 голос
/ 10 мая 2019

Вот решение с использованием numpy:

import numpy as np
a = [143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]
sizes = [3, 2, 2, 2, 2]
assert(sum(sizes) == len(a))
indices = np.cumsum(sizes)[:-1] # Ignore the last size; just take everything that is left (avoids a dangling empty list at the end)
result = [array.tolist() for array in np.split(a, indices)]
# >>> print(result)
# [[143, 146, 152], [235, 246], [468, 476], [607, 615], [707, 712]]

Версия с одним вкладышем:

result = [array.tolist() for array in np.split(a, np.cumsum(sizes)[:-1])]
1 голос
/ 10 мая 2019

На самом деле вы можете перебирать список groups, используя индексы, перебирая его для получения фрагментов, а затем создавать массив результатов

a=[143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]

groups = [3,2,2,2,2]

res = []

idx=0
#Iterate over groups, and calculate indexes for slicing
for group in groups:
    res.append(a[idx:idx+group])
    #Increment indexes accordingly
    idx+=group

print(res)

Выходные данные

[[143, 146, 152], [235, 246], [468, 476], [607, 615], [707, 712]]
1 голос
/ 10 мая 2019

Это один из подходов. Использование iter и простая итерация.

Демо:

a=[143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]
a = iter(a)
shape =[3,2,2,2,2]

result = []
for s in shape:
    temp = []
    for i in range(s):
        temp.append(next(a))
    result.append(temp)
print(result)

Выход:

[[143, 146, 152], [235, 246], [468, 476], [607, 615], [707, 712]]
1 голос
/ 10 мая 2019
a=[143, 146, 152, 235, 246, 468, 476, 607, 615, 707, 712]
shape=[3,2,2,2]
b=[ [] for item in shape] # creates empty lists in b
idx=0
for item in a:
   b[idx].append(item) # appending the next item
   shape[idx]-=1
   if b[idx]==0:
       idx+=1           
print(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...