【问题标题】:Match strings of different length in two lists of different length在两个不同长度的列表中匹配不同长度的字符串
【发布时间】:2022-11-16 23:14:48
【问题描述】:

假设我有两个简单的字符串列表:

a = ["today", "I", "want", "to", "eat", "some", "cake."]
b = ["to", "da", "y", "I", "wa", "nt", "to", "ea", "t", "some", "ca", "ke", "."]

在列表b 中,列表a 的某些字符串(不是全部)被拆分为多个子字符串。请注意,与a 中的字符串相对应的b 中的子字符串是相邻的,并且顺序相同,如上例所示。

我想获得一个列表 c,其中 b 中对应于 a 中单个字符串的子字符串放在一个子列表中:

c = [["to", "da", "y"], ["I"], ["wa", "nt"], ["to"], ["ea", "t"], ["some"], ["ca", "ke", "."]]

不幸的是,我没有任何代码可以分享,因为我不知道如何解决这个问题。

谢谢!

【问题讨论】:

  • 你说“在列表b中,列表a的一些字符串被拆分成多个子字符串。”是一些字符串还是所有字符串?它们在b 中的顺序与在a 中的顺序相同吗?
  • 迭代a中的单词对于每个单词测试,使用word.startswith()b(另一个循环)的每个元素进行比较。这是一个很好的起点。然后你应该考虑如何通过删除前缀来获得完整的答案并重复这个过程直到重建一个完整的单词。
  • 是否所有的子串都相邻b
  • 是的,子串是相邻的,是的,它们的顺序相同

标签: python string list


【解决方案1】:
a = ["today", "I", "want", "to", "eat", "some", "cake."]
b = ["to", "da", "y", "I", "wa", "nt", "to", "ea", "t", "some", "ca", "ke", "."]
c = []

for element in a:
    temp_list = []
    while "".join(temp_list) != element:
        temp_list.append(b.pop(0))
    c.append(temp_list)

c 的值:

[['to', 'da', 'y'],
 ['I'],
 ['wa', 'nt'],
 ['to'],
 ['ea', 't'],
 ['some'],
 ['ca', 'ke', '.']]

我不知道是否还有其他聪明的方法可以做到这一点。只需使用 .pop(0) 来为您节省一些代码

【讨论】:

  • 假设b 中的子串是相邻的。你应该提一下。
  • 这是非常低效的,尤其是在重复连接 temp_list 中的相同元素以及循环中在索引 0 处弹出列表时。
【解决方案2】:

@Ben.S. 的答案有效但成本O(m×n×k)在时间复杂度上,其中n是两个列表的长度和k是单词的平均长度。

一种更有效的方法,可以解决时间复杂度为上)是继续将b的单词片段附加到新列表的最后一个子列表,但跟踪附加到最后一个子列表的片段的总长度,并在总长度等于时附加一个新的子列表a中对应单词的长度:

c = []
for i in b:
    if not c or length == target:
        length = 0
        target = len(a[len(c)])
        c.append([])
    length += len(i)
    c[-1].append(i)

演示:https://replit.com/@blhsing/ExoticConsiderateSearchservice

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 2023-01-22
    • 1970-01-01
    • 2016-01-17
    • 2012-12-23
    相关资源
    最近更新 更多