Замена элемента из одного списка всеми элементами в другом списке - PullRequest
0 голосов
/ 06 ноября 2019

У меня проблемы с объединением одного списка в другой по заданному индексу. Идея такова:

"Для каждого слова в первичном списке, если это слово X, замените его всеми словами во вторичном списке."

Вот пример. Он вставляет вторичный список в первичный список с правильным индексом:

primary_list = ['the', 'black', 'cat', 'jumped']
secondary_list = ['big', 'grey']

for i, word in enumerate(primary_list):
    if word == "black":
        primary_list[i] = secondary_list

primary_list 
>> ['the', ['big', 'grey'], 'cat', 'jumped']

Идеальный вывод:

['the', 'big', 'grey', 'cat', 'jumped']

Я также попробовал понимание списка:

primary_list[i] = [item for item in secondary_list]

Он не только избыточен, но и делает то же самое, что и выше.

Здесь есть и другие ответы, в которых использовалась нарезка списка, но я не был уверен, как использовать их в моем синтаксисе. Мысли?

Ответы [ 6 ]

0 голосов
/ 06 ноября 2019

Другой вариант с использованием строк:

primary_list = ['the', 'black', 'cat', 'jumped']
secondary_list = ['big', 'grey']
for i in range(len(primary_list)):
    if primary_list[i] == 'black':
        primary_list[i] = secondary_list

final_list = repr(primary_list).replace('[', '').replace(']', '').replace("'", '').split(', ')
print(final_list)

Вывод:

['the', 'big', 'grey', 'cat', 'jumped']
0 голосов
/ 06 ноября 2019
primary_list = ['the', 'black', 'cat', 'jumped']
secondary_list = ['big', 'grey']

for i, word in enumerate(primary_list):
    if word == "black":
        primary_list[i:len(secondary_list)] = secondary_list

print(primary_list)

['the', 'big', 'grey', 'cat', 'jumped']
0 голосов
/ 06 ноября 2019

Простой подход с использованием нарезки.

>>> a = [1, 2, 3, 7, 8]
>>> b = [4, 5, 6]
>>> a[3:3] = b
>>> a
[1, 2, 3, 4, 5, 6, 7, 8]
0 голосов
/ 06 ноября 2019

Вы должны создать еще один список и добавить элементы списка праймеров и вторичные элементы списка.

primary_list = ['the', 'black', 'cat', 'jumped']
secondary_list = ['big', 'grey']
result_list=[]
for i, word in enumerate(primary_list):
    if word == "black":
        for secod_val in secondary_list:
            result_list.append(second_val)
    else:
        result_list.append(word)
0 голосов
/ 06 ноября 2019

Проблема в вашем коде была вызвана двумя причинами в следующей строке:

  1. при попытке назначить список определенному элементу в primary_list.
  2. не использует secondary_list.copy().

Если у вас было несколько вхождений 'black', то это будет copy вторичный список. Любое из этих значений, если оно будет изменено, впоследствии изменит другие, так как они будут использовать одну и ту же область памяти.

primary_list[i] = secondary_list

Вот решение.

final_list = list()
for word in primary_list:
    if word=='black':
        final_list += secondary_list.copy()
    else:
        final_list.append(word)

final_list

Вывод :

['the', 'big', 'grey', 'cat', 'jumped']
0 голосов
/ 06 ноября 2019

Вот вариант с использованием промежуточного списка result:

>>> primary_list = ['the', 'black', 'cat', 'jumped']
>>> secondary_list = ['big', 'grey']
>>> result = []
>>> for word in primary_list:
...   if word == "black":
...     result += secondary_list
...   else:
...     result.append(word)
... 
>>> result
['the', 'big', 'grey', 'cat', 'jumped']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...