обмен нескольких элементов в списке - PullRequest
0 голосов
/ 15 октября 2018

Я хочу поменять элементы в списке, но два слова ('go', 'chargers') всегда меняются местами и приходят за примером:

>lst = ['hello', 'go', 'hi', 'chargers']
>lst = ['hello', 'go', 'chargers', 'hi']

Я могу использовать списочные назначения:

lst[2], lst[3] = lst[2], lst[3]

но, обобщая, как это будет работать, например

['hello', 'go', 'sun', 'chargers', 'good', 'go', 'can', 'chargers']
['hello', 'go', 'chargers','sun', 'good', 'go', 'chargers', 'can']

, как бы я соединил все 'go' 'зарядные устройства'

Ответы [ 4 ]

0 голосов
/ 15 октября 2018

Вот не очень элегантное решение.Сначала определите местоположение зарядных устройств.Поменяйте местами каждый элемент с расположением зарядных устройств, как только будет замечен ход.

0 голосов
/ 15 октября 2018

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

words = ['hello', 'go', 'sun', 'chargers', 'good', 'go', 'can', 'another word', 'chargers']

go_indices = [i for i, w in enumerate(words) if w == 'go']
charger_indices = [i for i, w in enumerate(words) if w == 'chargers']

for gi, ci in list(zip(go_indices, charger_indices)):
    words[gi + 1], words[ci] = words[ci], words[gi + 1]

print(words)
# ['hello', 'go', 'chargers', 'sun', 'good', 'go', 'chargers', 'another word', 'can']
0 голосов
/ 15 октября 2018

Я не утверждаю, что это особенно элегантно или пифонично.

def go_chargers(lst):
    o = []

    for i in range(0, len(lst)):
        o.append(lst[i])
        if lst[i] == 'go':
            for j in range(i + 2, len(lst)):
                if lst[j] == 'chargers':
                    lst[i+1], lst[j] = lst[j], lst[i+1]
                    break
    return o

print(go_chargers(['go', 'sun', 'chargers', 'good', 'go', 'can', 'chargers']))
# ['go', 'chargers', 'sun', 'good', 'go', 'chargers', 'can']

print(go_chargers( ["Rock", "go", "Stars", "go", "Paper", "chargers", "Scissors", "chargers"]))
# ['Rock', 'go', 'chargers', 'go', 'chargers', 'Stars', 'Scissors', 'Paper']
0 голосов
/ 15 октября 2018

Используйте enumerate в усеченном списке, а затем выполните обмен с назначением из нескольких переменных

for i, v in enumerate(lst[:-2]):
    if v == 'go' and lst[i + 2] == 'chargers':
        lst[i + 1], lst[i + 2] = lst[i + 2], lst[i + 1]

print(lst) # => ['hello', 'go', 'chargers', 'sun', 'good', 'go', 'chargers', 'can']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...