Заменить определенные значения в списке на значения из другого списка - PullRequest
3 голосов
/ 21 июня 2019

У меня есть два списка в моем коде Python: list_1 = [1, «Да», 3, «Нет», 5, «Да», 7] и list_2 = ['a', 'b', 'c']

Я хочу вставить значение list_2 в list_1, где это «да» или «нет».

Я пробовал что-то подобное, получая значение индекса list_1 и пытался вставить list_2, но это не сработало.

list_1 = [1, 'Yes', 3, 'No', 5, 'yes', 7]
list_2 = ['a', 'b', 'c']

for (each, i) in zip(list_2, range(len(list_1))):
    if list_1 == 'yes' or list_1 == 'no':
        list_1.insert(i, each)

for each in list_1:
    print(each)

Я получил только вывод list_1, я хочу, чтобы мой окончательный список был таким f_list = [1, 'a', 3, 'b', 5, 'c', 7] Как мне этого добиться?

Ответы [ 5 ]

3 голосов
/ 21 июня 2019

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

it = iter(list_2)
[next(it) if str(x).lower() in {'yes', 'no'} else x for x in list_1]
# [1, 'a', 3, 'b', 5, 'c', 7]

Если количество элементов «да» / «нет» в list_1 больше, чем количество элементов в list_2, то вы можете использовать функцию для заполнения list_2 значением заполнителя (например, None),

from itertools import chain, cycle

def pad(seq, filler=None):
    yield from chain(seq, cycle([filler]))

it = pad(list_2)
[next(it) if str(x).lower() in {'yes', 'no'} else x for x in list_1]   
# [1, 'a', 3, 'b', 5, 'c', 7]
3 голосов
/ 21 июня 2019

В вашем текущем подходе вы сравниваете список с yes и no в условном if list_1 == 'yes' or list_1 == 'no':, которое не сработает, следовательно, условие if никогда не выполняется и list_1 остается таким, как есть

Простой подход с использованием цикла for состоит в том, чтобы искать yes и no в list_1, и, найдя его, заменить его элементом list_2 и увеличить счетчик, чтобы перейти к следующему элементу. из list_2

list_1 = [1, 'Yes', 3, 'No', 5, 'yes', 7]
list_2 = ['a', 'b', 'c']

#variable to keep track of elements of list_2
index = 0

#Iterate through indexes and item of list_1 using enumerate
for idx, item in enumerate(list_1):

    #If an item in list_1 matches yes or no
    if str(item).lower() in ['yes', 'no']:

        #Replace that item with item in list_2
        list_1[idx] = list_2[index]

        #Move to next item in list_2
        index+=1

print(list_1)

Вывод будет

[1, 'a', 3, 'b', 5, 'c', 7]
1 голос
/ 21 июня 2019

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

list_1 = [1, 'Yes', 3, 'No', 5, 'yes', 7]
list_2 = ['a', 'b', 'c']

list_2_vals = list_2[::-1] # So we don't modify the original list_2

# Creates a new list_1 with the values we want
list_1_new = [list_2_vals.pop() if str(x).lower() in ['yes', 'no'] else x for x in list_1]

print(list_1_new)
0 голосов
/ 21 июня 2019
list_1 = [1, 'Yes', 3, 'No', 5, 'yes', 7]
list_2 = ['a', 'b', 'c']

idx_list = [idx for idx, x in enumerate(list_1) if isinstance(x,basestring) and x.lower() in ['yes', 'no']]
for idx, val in zip(idx_list, list_2):
    list_1[idx] = val
print(list_1)

выход

[1, 'a', 3, 'b', 5, 'c', 7]
0 голосов
/ 21 июня 2019

Панды могут сделать это:

import pandas as pd
list_1 = [1, 'Yes', 3, 'No', 5, 'yes', 7]
list_2 = ['a', 'b', 'c']

df_1 = pd.Series(list_1)
df_1 = df_1.replace('Yes', list_2[0])
df_1 = df_1.replace('No', list_2[1])
df_1 = df_1.replace('yes', list_2[2])

f_list = df_1.values.tolist()
print(f_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...