我想比较两个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将始终具有相同的长度。
答案 0 :(得分:8)
您可以使用创建元组,这些元组由两个列表中的一个元素组成,然后对它们进行排序,最后按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)
返回可迭代的元组,其中每个元组都包含来自B
和A
的元素:
>>> 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]
创建一个特定的函数,它将两个列表(A
,B
)和一个数字(n
)作为参数。选择A
中与B
中与n
相同的列表位置具有相同列表位置的所有项目。 zip用于将A
和B
中的项目与相同的列表位置配对。此功能使用列表推导来从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])
>>>