比较Python中的两个列表A,B,找到A中与B中相同数字对应的所有元素

时间:2017-02-02 03:29:58

标签: python list

我想比较两个Python列表,' A'和' B'以这种方式,我可以找到 A 中的所有元素,这些元素对应于 B中的相同数字。我想为 B中的每个数字执行此操作。例如,如果

A = [5, 7, 9, 12, 8, 16, 25]
B = [2, 1, 3, 2, 3, 1, 4]

我想得到

[7,16] corresponding to the number 1 of listB
[5, 12] corresponding to the number 2 of listB
[9, 8] corresponding to the number 3 of listB
[25] corresponding to the number 4 of listB

A和B将始终具有相同的长度。

5 个答案:

答案 0 :(得分:8)

您可以使用enter image description here创建元组,这些元组由两个列表中的一个元素组成,然后对它们进行排序,最后按B的值对它们进行分组:

>>> from itertools import groupby
>>> A = [5, 7, 9, 12, 8, 16, 25]
>>> B = [2, 1, 3, 2, 3, 1, 4]
>>> for k, g in groupby(sorted(zip(B,A)), key=lambda x: x[0]):
...     print('{} corresponds to {}'.format([x[1] for x in g], k))
... 
[7, 16] corresponds to 1
[5, 12] corresponds to 2
[8, 9] corresponds to 3
[25] corresponds to 4

在上面zip(B, A)返回可迭代的元组,其中每个元组都包含来自BA的元素:

>>> list(zip(B,A))
[(2, 5), (1, 7), (3, 9), (2, 12), (3, 8), (1, 16), (4, 25)]

然后对上面的结果进行排序,以便B中具有相同值的所有元组彼此相邻:

>>> sorted(zip(B,A))
[(1, 7), (1, 16), (2, 5), (2, 12), (3, 8), (3, 9), (4, 25)]

排序结果传递给zip,它根据key函数返回的值对元组进行分组,在本例中是元组中的第一项。结果是(key, group)元组的可迭代,其中group是元素的可迭代:

>>> [(k, list(g)) for k, g in groupby(sorted(zip(B,A)), key=lambda x: x[0])]
[(1, [(1, 7), (1, 16)]), (2, [(2, 5), (2, 12)]), (3, [(3, 8), (3, 9)]), (4, [(4, 25)])]

答案 1 :(得分:2)

尝试这种方法。

unique = set(B)    # Creates a set of unique entries in B
for u in unique:
    # Find indices of unique entry u
    indices = [i for i, x in enumerate(B) if x == u]

    # Pull out these indices in A
    corrEntry = [A[i] for i in indices]  

    # Do something with the data, in this case print what OP wants
    print('{} corresponds to the number {} of list B'.format(corrEntry , B[indices[0]]))

使用set函数查找B中的唯一条目。 然后我们遍历这些独特的条目。第一个列表推导(对于indices)查找B中与该唯一条目匹配的条目的索引。第二个保存了这些指数的A值。

答案 2 :(得分:2)

我认为您可以使用此代码:

A = [5, 7, 9, 12, 8, 16, 25]
B = [2, 1, 3, 2, 3, 1, 4]

d = {}

for a, b in zip(A, B):
    d.setdefault(b, [])
    d[b].append(a)

for k, v in sorted(d.items()):
    print('{} corresponds {}'.format(v, k))

字典的每个键都是B的元素,其关联值将是您想要的列表。

答案 3 :(得分:1)

使用collections.defaultdict的替代方案:

import collections as ct

dd = ct.defaultdict(list)
for a, b in zip(A, B):
    dd[b].append(a)

dd
# defaultdict(list, {1: [7, 16], 2: [5, 12], 3: [9, 8], 4: [25]})

打印结果样本:

for k, v in sorted(dd.items()):
    print("{} corresponding to the number {} of listB".format(v, k))

# [7, 16] corresponding to the number 1 of listB
# [5, 12] corresponding to the number 2 of listB
# [9, 8] corresponding to the number 3 of listB
# [25] corresponding to the number 4 of listB

答案 4 :(得分:1)

A = [5, 7, 9, 12, 8, 16, 25]
B = [2, 1, 3, 2, 3, 1, 4]

创建一个特定的函数,它将两个列表(AB)和一个数字(n)作为参数。选择A中与B中与n相同的列表位置具有相同列表位置的所有项目。 zip用于将AB中的项目与相同的列表位置配对。此功能使用列表推导来从A中选择项目。

>>> def f(A, B, n):
    return [a for a, b in zip(A,B) if b == n]

>>> f(A, B, 2)
[5, 12]
>>> 

可以在没有列表理解的情况下编写函数:

def g(A, B, n):
    result = []
    for a, b in zip(A, B):
        if b == n:
            result.append(a)
    return result

使用fuctools.partial可以修复列表参数:

import functools
f_AB = functools.partial(f, A, B)

然后可以像这样使用:

>>> f_AB(3)
[9, 8]

>>> numbers = [3, 4, 2]
>>> for n in numbers:
    print (n, f_AB(n))

(3, [9, 8])
(4, [25])
(2, [5, 12])
>>>