【问题标题】:How can I check if a list of nodes have already been included in a list within a list of lists?如何检查节点列表是否已包含在列表列表中的列表中?
【发布时间】:2019-02-01 13:49:04
【问题描述】:

我有以下列表:a = [[1,2,3],[4,5,6],[7,8,9]],其中包含 3 个列表,每个列表都是图的节点列表。

我还得到了一个节点元组z = ([1,2], [4,9])。现在,我想检查z 中的任何一个列表是否已包含在a 中的列表中。例如,[1,2][1,2,3] 中,在a 中,但是 [4,9] 不在[4,5,6] 中,尽管存在重叠节点。

备注:为了澄清,我还在检查列表的子列表,或者列表中的每个项目是否都在另一个列表中。例如,我认为 [1,3] 位于 [1,2,3] 中。

我该怎么做?我尝试在Python 3 How to check if a value is already in a list in a list 上实现类似的东西,但我遇到了心理僵局..

对这个问题有一些见解会很棒!

【问题讨论】:

  • 经验法则,当您检查某物是否已经存在时,hashmap 可能是您的首选。
  • @JosephSeungJaeDollar 感谢您的提醒!不幸的是,我是 Python 的初学者,我可能需要很长时间才能“掌握”哈希映射..:/
  • 尝试查看集合。
  • 您是要检查列表的子列表,还是只是检查列表中的每个项目是否都在另一个列表中?也就是说,你认为[1,3] 是“在”[1,2,3]
  • @blhsing 是的,我是。我在上面的例子中说明了这一点。谢谢你的问题。我将添加您的评论以使其更清楚! :)

标签: python python-3.x list tuples element


【解决方案1】:

您可以使用anyall

a = [[1,2,3],[4,5,6],[7,8,9]]
z = ([1,2], [4,9])
results = [i for i in z if any(all(c in b for c in i) for b in a)]

输出:

[[1, 2]]

【讨论】:

  • 我什至不知道这些关键字的存在 :o
  • 感谢@Ajax1234!只是好奇 all() 运算符是做什么的?
  • @T.Woody 注意:anyall 不是关键字,而是内置函数(forin 是关键字)。 @Stoner all() 确保所有条件都是 Trueany() 确保至少一个条件是 True
  • @AChampion 感谢您的澄清。我会接受这个答案,因为我对 Python 的掌握程度更容易理解! :)
【解决方案2】:

您可以使用sets 来比较节点是否出现在a 中,<= 的集合运算符相当于issubset()
itertools 模块提供了一些有用的功能,itertools.product() 是相当于嵌套的 for 循环。
例如:

In []:
import itertools as it
[m for m, n in it.product(z, a) if set(m) <= set(n)]

Out[]:
[[1, 2]]

【讨论】:

  • 谢谢,这也是一个很好的答案!我不知道套装可以这样使用
【解决方案3】:
a = [[1,2,3],[4,5,6],[7,8,9]]

z = ([1,2], [4,9])

for z_ in z:
    for a_ in a:
        if set(z_).issubset(a_):
            print(z_)

【讨论】:

  • 感谢您的回复!澄清一下,issubset() 是内置的还是我必须导入一个包?
  • issubset() 是标准 set 类型的方法,无需导入。
  • @Stoner你不需要导入,供你参考python-reference.readthedocs.io/en/latest/docs/sets/…
  • 感谢您的澄清。我去看看:)
【解决方案4】:

由于您只想将子列表作为子集进行测试,因此您可以将子列表转换为集合,然后使用 set.issubset() 进行测试:

s = map(set, a)
print([l for l in z for i in s if set(l).issubset(i)])

这个输出:

[[1, 2]]

【讨论】:

  • 感谢您的回复!只是好奇,地图实际上是如何工作的?
  • 您的意思是a = map(set, a),因为当前s = map(set, a) 没有被使用,您在理解中重新定义s 并仍在使用a。注意:它之所以有效,是因为 issubset() 将采用任何可迭代对象(&lt;= 集合运算符不会发生这种情况)。
  • @AChampion 谢谢。我的错。我已经更正了我的答案。
  • @Stoner map 函数遍历第二个参数指定的列表并将列表中的每一项传递给第一个参数指定的函数,因此map(set, a)a 从列表到一系列集合的列表。详情请参考map's documentation
【解决方案5】:

itertools.product是你的朋友(不安装内置python模块):

from itertools import product
print([i for i in z if any(tuple(i) in list(product(l,[len(i)])) for l in a)])

输出:

[[1, 2]]

【讨论】:

  • 感谢您的分解!您的回复与@Ajax1234 的一样清晰易懂:)
  • @Stoner 很高兴我提供了帮助,?
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多