代码之家  ›  专栏  ›  技术社区  ›  Hews

在两个独立列表中匹配子序列

  •  2
  • Hews  · 技术社区  · 6 年前

    我正在处理两个单独的列表,一个是 split 一个字符串和另一个包含列表对象的字符串的结果,列表对象中的第一项为字符串。

    例如,

    list_0: ["Hey", "hello?", "hi"]
    list_1: [["Hey", 0.13, 0.14, 0, 0.58], ["hello?", 0.15, 0.16, 1, 0.23], ["hi", 0.17, 0.18, 0, 0.32]]
    

    list_0 按正确顺序排列并包含重复值,它不能是集合,因为它是音频文件的翻译。在 list_1 ,第三个元素是 reference_number 对每个演讲者。

    我想对译文进行分类,找出每个单词/短语的发言人,这样我就能看到 reference_number_0 "Hey", "hi" reference_number_1 "hello?" 是的。

    由于可能有重复的值,我需要确保我没有错误地匹配第一对。

    我怎么能找到 ref_number 每一个完整的短语?

    预期产量

    0: "Hey", "hi"
    1: "hello?"
    

    更复杂的例子是 列表\u 0 列表1 以下内容:

    list_0: ["Have", "we", "all", "had", "lunch" yes", "yes", "not", "yet"]
    list_1: [["Have", 0.0, 0.1, 0, 0.12], ["we", 0.2, 0.3, 0, 0.48], ["all", 0.4, 0.5, 0, 0.85], ["had", 0.6, 0.7, 0, 0.82], ["lunch", 0.8, 0.9, 0, 0.35], ["yes", 0.9, 1.0, 0, 0.57], ["yes", 1.1, 1.2, 1, 0.56], ["not", 1.3, 1.4, 2, 0.25], ["yet", 1.5, 1.6, 2, 0.73]]
    

    这里有三个扬声器-0,1,2。输出应为:

    0: "Have", "we", "all", "had", "lunch", "yes"
    1: "yes"
    2: "not", "yet"
    

    干杯:)

    3 回复  |  直到 6 年前
        1
  •  4
  •   dawg    6 年前

    只需建立一个列表:

    di={}
    for l0,l1 in zip(list_0,list_1):
        di.setdefault(l1[3],[]).append(l0)
    
    >>> di
    {0: ['Have', 'we', 'all', 'had', 'lunch', 'yes'], 1: ['yes'], 2: ['not', 'yet']}
    

    对于您的特定输出:

    >>> '\n'.join("{}: {}".format(e, ", ".join(di[e])) for e in sorted(di))
    0: Have, we, all, had, lunch, yes
    1: yes
    2: not, yet
    
        2
  •  0
  •   bobrobbob    6 年前

    这应该可以做到:

    from itertools import groupby
    
    result = []
    for k, v in groupby(list_1, key=lambda x: x[3]):
        subresult = []
        for r in list(v):
            subresult.append(r[0])
        result.append(subresult)
    

    输出:

    [['Have', 'we', 'all', 'had', 'lunch', 'yes'], ['yes'], ['not', 'yet']]
    
        3
  •  0
  •   Tom Zych    6 年前

    好吧,我们已经 list_0 按照你想要的顺序,但是根据你的评论, list_1 不一定以任何特定的顺序;唯一的方法 通过匹配字符串来匹配它们。这个问题可能应该 已经把数据整理好了,说清楚了。

    这里出现了一个问题。例如,假设 列表\u 0 有以下数据:

    list_0 = ['yes', 'no', 'yes', 'yes']
    

    并且,排除无关的浮点数据,假设 列表1 告诉我们 reference_number_0 'yes' 两次,而且 reference_number_1 '是' 一次和 'no' 一次。

    我们怎么判断顺序 参考号 说那些 话?

    发言顺序可能是:

    0-yes 1-no 1-yes 0-yes
    

    但也可能是这样:

    1-yes 1-no 0-yes 0-yes
    

    无法判断哪个是正确的。所以,一般来说, 问题是无法解决的。