在Python中,如何比较两个列表并获得匹配的所有索引?

在Python中,如何比较两个列表并获得匹配的所有索引?,python,Python,这可能是一个我刚刚遗漏的简单问题,但我有两个包含字符串的列表,我希望一个元素一个元素地“反弹”,另一个元素返回匹配的索引。我希望有多个匹配,并希望所有的索引。我知道list.index()是第一个,你可以很容易地得到最后一个。例如: list1 = ['AS144','401M','31TP01'] list2 = ['HDE342','114','M9553','AS144','AS144','401M'] 然后我将遍历列表1,比较列表2并输出: [0,0,0,1,1,0],[3,4]或等

这可能是一个我刚刚遗漏的简单问题,但我有两个包含字符串的列表,我希望一个元素一个元素地“反弹”,另一个元素返回匹配的索引。我希望有多个匹配,并希望所有的索引。我知道list.index()是第一个,你可以很容易地得到最后一个。例如:

list1 = ['AS144','401M','31TP01']

list2 = ['HDE342','114','M9553','AS144','AS144','401M']
然后我将遍历列表1,比较列表2并输出:
[0,0,0,1,1,0],[3,4]
或等,用于第一次迭代
[0,0,0,0,0,1],[6]

和第三方的
[0,0,0,0,0,0]
[]

编辑: 对不起,有什么困惑。我想以这样的方式得到结果,然后我可以像这样使用它们-我有第三个列表,让我们调用list3,我想从该列表中得到输出索引中的值。ie
list3[previousindexoutput]=响应值列表

这并不能回答问题。见下面我的评论

首先:

list(i[0] == i[1] for i in zip(list1, list2))

我不确定您希望如何包装这些产品,但这确实有效:

def matches(lst, value):
    return [l == value for l in lst]

all_matches = [matches(list2, v) for l in list1]

就我个人而言,我会从以下几点开始:


matches=[列表1中的项目如果列表2中的项目存在]

这将给出一个列表,列表中的值为真/假,而不是1/0:

matches = [ [ list1[i] == list2[j] for j in range(0, len(list2)) ] for i in range(0, len(list1)) ]
编辑:如果您使用的是2.5或更高版本,则应给出1和0:

matches = [ [ 1 if list1[i] == list2[j] else 0 for j in range(0, len(list2)) ] for i in range(0, len(list1)) ]

这应该可以满足您的需要,并且可以轻松地将其转换为发电机:

>>> [[i for i in range(len(list2)) if item1 == list2[i]] for item1 in list1]
[[3, 4], [5], []]
以下是输出格式稍有不同的版本:

>>> [(i, j) for i in range(len(list1)) for j in range(len(list2)) if list1[i] == list2[j]]
[(0, 3), (0, 4), (1, 5)]
导致

[[3, 4], [5], []]

这为我返回
[False,False,False]
。哦,对不起。我误解了这个问题。如果两个列表的相同索引中的项目相同,“我的代码”将返回一个带有
True
False
的列表。例如,对于
list1=[1,2,3]
list2=[1,2,4]
它返回
[True,True,False]
。如果您愿意,请投票否决我的答案:-)这很好,我觉得它可以很容易地修改为给出索引值,而不是列出匹配的值。@Kosig:当然,这就是重点;如果需要匹配项的索引,可以执行类似于
索引=[list1.index(i)for i in list2]
的操作,反之亦然。我会首先将list2缓存在
集中,否则,您将获得O(n*n)性能。是的。第二个正是我想要的。但是现在我有了这些索引,我如何从另一个列表中得到它们的值呢?@Kosig:我不清楚你还想要什么。你所说的“我如何从另一个列表中获取他们的CooResponse(sic)值”是什么意思?你在问题中没有提到其他列表吗?还是要访问列表1/列表2中的原始值?你是想用匹配列表来做这个吗?我知道已经很久了,但我想知道你为什么不想发表一个关于解决方案的句子。这对我会有很大帮助的!
def findInstances(list1, list2):
    """For each item in list1,
    return a list of offsets to its occurences in list2
    """

    for i in list1:
        yield [pos for pos,j in enumerate(list2) if i==j]

list1 = ['AS144','401M','31TP01']
list2 = ['HDE342','114','M9553','AS144','AS144','401M']

res = list(findInstances(list1, list2))
[[3, 4], [5], []]