Python перемещает несколько элементов в списке - PullRequest
0 голосов
/ 18 марта 2019

Мне нужно сместить элементы в списке, если есть пустые пробелы, начинающиеся с определенного индекса, элементы справа от смещенных элементов НЕ ДОЛЖНЫ смещаться от своего индекса, демонстрация:

# desired output
["not end","x","y","","","","don't move"]


# works here
l = ["not end","","","","x","y","don't move"]
start = 1
aext_len = 3
end = start + aext_len + 1

for empty, cell in enumerate(l[start:end - 1], 1):
    if cell:
        break

for z in range(aext_len + 2 - empty):
    l.insert(start + z, l.pop(start + empty + z))
print (l)
#['not end', 'x', 'y', '', '', '', "don't move"]


# not here
l = ["not end","","x","y","","","don't move"]
start = 1
aext_len = 3
end = start + aext_len + 1

for empty, cell in enumerate(l[start:end - 1], 1):
    if cell:
        break

for z in range(aext_len + 2 - empty):
    l.insert(start + z, l.pop(start + empty + z))
print (l)
#['not end', 'y', '', '', '', 'x', "don't move"]

1 Ответ

2 голосов
/ 18 марта 2019

Решение на самом деле намного проще.

l = ["not end", "", "", "", "x", "y", "don't move"]

Определить конец зоны "не двигаться":

MOVE = 6

"Выжимать" пустые строки:

part1 = [x for x in l[:MOVE] if x]

Переместить «выдавленные» пустые строки в конец:

part2 = (MOVE - len(part1)) * [""]

Объедините кусочки:

part1 + part2 + l[MOVE:]
#['not end', 'x', 'y', '', '', '', "don't move"]

В качестве альтернативы , вы можете отсортировать первую часть списка по свойству пустой строки:

sorted(l[:MOVE], key=lambda x: x=="") + l[MOVE:]
#['not end', 'x', 'y', '', '', '', "don't move"]
...