【问题标题】:Python comparing setsPython比较集
【发布时间】:2016-03-19 20:46:16
【问题描述】:

我需要比较集合以查看一个集合是否包含在另一个集合中

我正在导入两个文本文件作为集合。

.txt 文件中,您可以看到集合由行组成。

  • set1 = set(['thats true', 'thats false'])

  • set2 = set(['Well done thats true', 'Unfortunately thats false'])

'thats false' 出现在 set2 'Unfortunately thats false' 的第一个索引中。如何打印 set1 包含在 set2 中的索引?

【问题讨论】:

  • 听起来您不仅要检查一个集合是否是另一个集合的子集,还要检查一个字符串(集合的元素)是否是另一个字符串的子字符串。你能澄清一下吗?
  • 您正在测试 子字符串;你的集合之间没有严格的交集,Python 集合对象不支持你想要的开箱即用的东西。您要么必须进行 N x M 测试(创建两组的乘积并测试每个组合),要么构建相邻单词的索引以更有效地进行短语搜索。但这太宽泛了,无法在 SO 上讨论。
  • @T.Silver 集合是否包含字符串?对不起,如果是这样你是对的。我想搜索整个第二组,看看第一组是否包含在第二组中的任何位置。
  • 所以你想检查set1中的每个字符串s是否在set2中有一个字符串ss,这样sss的一个子字符串。如果这是正确的,我会建议编辑问题。
  • 如果您指的是集合中项的索引,则不能这样做,因为集合不是有序的。

标签: python set compare


【解决方案1】:

应该更改问题以反映顺序很重要的事实,因此值是列表,而不是集合。在这种情况下,下面的代码应该可以完成这项工作

# returns True if l1 is a "substring sublist" of l2
def is_substring_sublist(l1, l2):
    next_idx1s = [0]
    target_idx = len(l1)
    for idx2 in range(len(l2)):
        idx1s = [x for x in next_idx1s]
        next_idx1s = [0]

        for idx1 in idx1s:
            if l1[idx1] in l2[idx2]:
                next_idx1s.append(idx1+1)

        if target_idx in next_idx1s:
            return True
    return False

# Unit tests
list1 = ['a', 'b']
list2 = ['b', 'a']
list3 = ['c', 'a', 'b', 'd']
list4 = ['a', 'a', 'b']

assert is_substring_sublist(list1, list1)
assert not is_substring_sublist(list1, list2)
assert is_substring_sublist(list1, list3)
assert is_substring_sublist(list1, list4)
assert not is_substring_sublist(list2, list4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多