列表中成对元素的数量

4
a = [2,7,9]
b = [[7,9],[1,2],[2,9]]

列表[a]中有多少对匹配了元组[b]中的值? 注意,列表[a]中存在[7,9][2,9]两个匹配的元素对。尽管[1,2]这个元素对包含数字2,但因为它们的两个数字都不在列表[a]中,所以不计算在内。 返回值应该是2,即匹配对的数量。

len(filter(lambda l:if_in(b,l),a))

需要帮助创建一个if_in函数或者更简单的一次性编写此函数的方法。不管ab的大小如何,我该如何使此函数运行。

2个回答

6

a设置为一个集合,并使用set.issuperset,检查a是否是每个子列表的超集

a = [2,7,9]
b = [[7,9],[1,2],[2,9]]


st = set(a)

print(sum(st.issuperset(sub) for sub in b))
2

你可以选择两种方式,一种是将所有的子列表都转换为集合,另一种是像上面那样只转换一个集合。当a是一个子列表的超集时,该子列表就是a的子集:

In [6]: a = [2,7,9]

In [7]: b = [[7,9],[1,2],[2,9]]

In [8]: st = set(b[0])

In [9]: st.issubset(a)
Out[9]: True
In [10]: st = set(b[1])

In [11]: st.issubset(a)
Out[11]: False

In [13]: st = set(a)

In [13]: st.issuperset(b[0])
Out[13]: True

In [14]: st.issuperset(b[1])
Out[14]: False

很明显,由于您的列表中只有几个数字,因此最好从a中创建一个集合并使用超集。

0

如果你想处理数据集 a 的子集,你可以使用 itertools.combinations(iterable, r)。引用文档所说,返回输入数据集中长度为 r 的所有子序列。

from itertools import combinations

a = [2, 7, 9]
b = [(7, 9), (1, 2), (2, 9)]  
# combinations returns a collection of tuples
# so changed your b items to tuples.

len(filter(lambda x: x in b, combinations(a ,2))

对于大量输入,这将需要很长时间,并且有可能在完成之前就会出现内存错误。 - Padraic Cunningham

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