【问题标题】:To check if sublist exists in another list检查子列表是否存在于另一个列表中
【发布时间】:2015-06-09 15:36:57
【问题描述】:
coll = [[3, 3], [2, 2, 2], [2, 4], [2, 3], [2, 2]]
main = [4, 3, 3, 2, 2, 2, 2, 2, 2, 2]

我有 2 个列表。 'coll' 是一个列表列表,每个子列表包含可能有重复的整数(例如 [2, 2, 2])。 main 是一个包含整数的列表。我想检查 'coll' 的子列表元素是否存在于 'main' 中。对于这种情况,这是正确的,因为存在 [2, 2, 2], [3, 3] 和其他子列表。子列表和“主”中元素的顺序无关紧要。无论子列表中存在什么元素,它们都可能出现在“主”中的任何位置。

由于存在重复项,我无法使用集合。而且我不能使用字符串,因为:

coll = ['222']
main = ['423262']

我使用了一个子列表示例来显示使用字符串的问题。我的算法要求是,在这种情况下,也返回“真”,因为“2”出现在 3 个位置,索引为 1、2、5。但是:

if coll in main:
    return True
else:
    return False

如果我使用字符串进行检查,这将返回 false。

请提出任何方法。

【问题讨论】:

  • 如果 main 是 [2, 2, 2] 应该是什么输出? [2, 2, 2][2, 2] 都应该匹配?
  • 在这种情况下应该返回'true'。实际上,“coll”中的子列表已经按照它们的优先级顺序排列。由于 [2, 2, 2,] 优先级在 [2, 2] 之前存在,并且它存在于“main”中,因此它将返回“true”。程序不会检查 [2, 2]。

标签: list python-3.x sublist


【解决方案1】:

我认为最易读的方法是为每个子列表创建一个 Counter 实例,如果它符合子列表的每个参数的要求,它们会使用列表“count”方法检查:

from itertools import Counter

def checksub(main, sublist):
    c = Counter(sublist)
    for num, count in c.items():
        if main.count(num) < count:
            return False
    return True

all(checksub(main, sublist) for sublist in coll)

这并不快 - 如果您正在迭代大量数据,您最好使用某种方法将“主”列表映射到数据结构中,在该数据结构中可以使用“数数”。或者,如果不同的数字很少,甚至像缓存每个不同数字的“计数”返回一样简单。 否则,对于小尺寸的“主要”,这可能就足够了。

在对您的问题进行第二次阅读时,您似乎只需要在main 中出现一个子列表 - 如果是这种情况,只需将对all 的调用替换为上面的any

【讨论】:

  • 谢谢!!是否有可能获得与“真”匹配的子列表?
  • 对于所有 sublsts,使用 filter 而不是 any:filter(lambda x: checksub(main, x), (sublist for sublist in coll)) 。对于第一个子列表,一个普通的多行 Python forloop - for sublist in coll: if checksub(main, sublist): ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2013-12-12
  • 2021-01-04
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多