在两个Python列表中找到共同项的索引

3
我有两个Python列表list_A和list_B,我想找到它们共享的公共项。我的代码如下所示:
both = []
for i in list_A:
    for j in list_B:
        if i == j:
            both.append(i)

最后的列表包含了两个列表中共同的元素。但是我还想返回这些元素在初始两个列表中的索引。我该如何做呢?


1
你期望什么输出?一般来说,我会期望使用 for index, item in enumerate(something): 来帮助实现。 - jonrsharpe
3
你想要哪个列表的索引?也许可以使用字典 - Hearner
1
问题不清楚。您是否需要索引,如果是,是哪个列表的索引?您是否想要相同索引处相等元素的索引?您是否想要像您的代码所示的那样获取值而不是索引?请添加一个[MCVE]。 - timgeb
1
请提供带有匹配输出(both)的示例输入(list_Alist_B)。确保您有一些元素在不同位置重复两次或更多次,以便没有歧义。 - bruno desthuilliers
4个回答

8

在Python中,建议尽可能避免使用for循环,如果有更好的方法可用。您可以使用Python set来有效地查找两个列表中的公共元素,如下所示:

both = set(list_A).intersection(list_B)

然后,您可以使用内置的index方法找到索引。
indices_A = [list_A.index(x) for x in both]
indices_B = [list_B.index(x) for x in both]

2
“在Python中建议尽可能避免使用for循环”这种说法是不正确的。建议的做法(不仅限于Python)是,当已知存在有效的解决方案且实现起来并不更加复杂时,应避免编写低效的代码。” - bruno desthuilliers
在Python中建议尽可能避免使用for循环。这似乎是一个通用语句,容易被许多用户误解。 - Yoshikage Kira
你真正应该说的是,如果有更好的方法可用,那么通过蛮力方法做一切通常是不鼓励的。 - Yoshikage Kira
注意 @Goion!已做出相应编辑。 - kosnik
这是非常低效的,因为“index”需要时间=列表的长度。 - user202729
显示剩余3条评论

0

使用pandas可以轻松解决此问题。

import pandas as pd

to_match = pd.Series(["c", "a", "b", "b", "c", "a"])
unique_vals = pd.Series(["c", "b", "a"])
indices = pd.Index(unique_vals).get_indexer(to_match)

Out[1]: array([0, 2, 1, 1, 0, 2])

0

你也可以使用numpy.intersect1d()获取常见元素及其索引

common_elements, a_indexes, b_indexes = np.intersect1d(a, b, return_indices=True)

0

不要通过迭代列表来访问元素,而是通过索引来访问:

both = []
for i in range(len(list_A)):
    for j in range(len(list_B)):
        if list_A[i] == list_B[j]:
            both.append((i,j))

这里i和j将取整数值,并且您可以通过索引检查list_A和list_B中的值。


@brunodesthuilliers 我知道enumerate的用法。 - RohithS98
那么,既然这是它的常规用途,为什么你不使用它呢? - bruno desthuilliers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接