尝试比较两个列表,找到相等的值并将其替换为另一个列表的索引,但它不起作用

问题描述 投票:0回答:4

基本上,我有一个列表,其中包含第二个列表的所有可能值。例如:

第一个列表(可能的值):

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)
python list for-loop comparison substitution
4个回答
1
投票

您的代码的问题在于您只是在每次迭代时替换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
投票

通过迭代列表得到的i不会将更改反映回列表中。因此没有变化。


创建一个将动物映射到索引位置的字典。

使用list comprehension通过将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]

质地:


0
投票

您可以使用dict理解来创建一个映射字典,使用enumerate函数将键映射到索引,然后将list2中的项映射到映射字典的值:

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

返回:

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

0
投票

你只能使用一个易于理解的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]
© www.soinside.com 2019 - 2024. All rights reserved.