Python Проблема с генерацией списка с информацией из другого списка - PullRequest
1 голос
/ 07 января 2020

Я хочу создать список с python, который основан на информации из другого списка. Следующий пример должен продемонстрировать, какую информацию я хочу передать:

Дан следующий список:

list_a=[0,0,0,0,0,0,0,0,0,1,2,3,4,0,0,0,0,1,2,0,0,0,0,1,2,3,4,5,0,0,0]

Затем список, который я хочу создать, должен выглядеть следующим образом:

list_b=[0,0,0,0,0,0,0,0,0,4,3,2,1,0,0,0,0,2,1,0,0,0,0,5,4,3,2,1,0,0,0]

Я начал так:

list_b=[]
list_b = [0] * list_a.__len__()         #create a list of nulls
for i in range (list_a.__len__()):
       if list_a(i)!=0:
            if list_a(i+1)=0:
                 list_b.insert(i-(list_a[i]-1),list_a[i])

Но тогда я только вставил первый элемент в list_b и все еще должен вставить все следующие элементы (например, вставил 4 и все еще нужно вставить 3,2, 1) и решение / код кажется слишком грязным.

Кто-нибудь знает элегантное решение?

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Сгруппируйте по нулям и поменяйте местами каждую группу.

>>> [x for _, g in itertools.groupby(list_a, bool) for x in list(g)[::-1]]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 5, 4, 3, 2, 1, 0, 0, 0]
1 голос
/ 07 января 2020

Не совсем уверен в его элегантности / эффективности, но вот ваше решение:

list_a = [0,0,0,0,0,0,0,0,0,1,2,3,4,0,0,0,0,1,2,0,0,0,0,1,2,3,4,5,0,0,0]
list_b = []
reverse_list = []

for i in list_a:
    if i == 0:
        if reverse_list:
            list_b += reverse_list[::-1]
            reverse_list.clear()
        list_b.append(i)
    else:
        reverse_list.append(i)
# If list ended without encountering zero
list_b += reverse_list[::-1]

print(list_a)
print(list_b)

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

[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 5, 4, 3, 2, 1, 0, 0, 0]
...