基本上,我有一个列表,其中包含第二个列表的所有可能值。例如:
第一个列表(可能的值):
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)
您的代码的问题在于您只是在每次迭代时替换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的答案。
您可能会发现一些有用的读物:
通过迭代列表得到的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]
质地:
您可以使用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]
你只能使用一个易于理解的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]