Попытка сравнить два списка, найти равные значения и заменить их индексом другого списка, но это не работает - PullRequest
0 голосов
/ 28 марта 2019

В принципе, у меня есть список, который содержит все возможные значения второго списка. Например:

Первый список (возможные значения):

list1 = ['cat','dog','pig'] 

Второй список:

list2 = ['dog','cat','cat','cat','dog','pig','cat','pig']

Я хочу сравнить эти списки и заменить все строки во втором списке на индекс первого.

Так что ожидайте что-то вроде этого:

list2 = [1,0,0,0,1,2,0,2]

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

Это было первое решение:

list3 = []
for i in list2:
    if i == 'cat':
        i = 0
        list3.append(i)
    elif i == 'dog':
        i = 1
        list3.append(i)
    elif i == 'pig':
        i = 2
        list3.append(i)
    list2 = list3


print(list2)

выход

[1, 0, 0, 0, 1, 2, 0, 2]

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

Итак, я попробовал это (и другие неудачные попытки), но это не работает

for i in list2:
    for j in list1:
        if i == j:
            i = list1.index(j)

Ответы [ 4 ]

1 голос
/ 28 марта 2019

Проблема с вашим кодом в том, что вы просто заменяете i на каждой итерации. Вы хотите создать список и добавлять к нему результат из list1.index(j) на каждой итерации:

 l = []
for i in list2:
    for j in list1:
        if i == j:
            l.append(list1.index(j))

Обратите внимание, что это можно упростить с помощью понимания списка:

[list1.index(i) for i in list2]
# [1, 0, 0, 0, 1, 2, 0, 2]

Обратите внимание, что для решения с меньшей сложностью вы можете создать словарь, отображающий строки для индексации, и просто создать список, просматривая строки в list2, как в ответе @ blhshing.


Некоторые чтения могут оказаться полезными:

0 голосов
/ 28 марта 2019

Вы можете использовать только один for loop и один if-statement, который легко понять.

list1 = ['cat','dog','pig']
list2 = ['dog','cat','cat','cat','dog','pig','cat','pig']

for i,item in enumerate(list2):
    if item in list1:
        list2[i] = list1.index(item)       

# list2 = [1, 0, 0, 0, 1, 2, 0, 2]
0 голосов
/ 28 марта 2019

Вы можете использовать понимание dict, чтобы создать dict отображения, который сопоставляет ключи с индексами с помощью функции enumerate, а затем отображает элементы в list2 в значениях dict отображения:

mapping = {k: i for i, k in enumerate(list1)}
list(map(mapping.get, list2))

Возвращает:

[1, 0, 0, 0, 1, 2, 0, 2]
0 голосов
/ 28 марта 2019

Значение i, получаемое при повторении списка, не отражает изменения обратно в список.Следовательно, без изменений.


Создайте словарь, который отображает животных в индексную позицию.

Используйте понимание списка, чтобы создать новый список, заменив животных из list2 его lookup-index:

list1 = ['cat','dog','pig']

lookup = {animal:index for index,animal in enumerate(list1)}

list2 = ['dog','cat','cat','cat','dog','pig','cat','pig']

result = [lookup.get(what) for what in list2]

print(result) # [1, 0, 0, 0, 1, 2, 0, 2]

Доку:

...