【问题标题】:Matching subsequences within two separate lists匹配两个单独列表中的子序列
【发布时间】:2018-12-18 21:50:56
【问题描述】:

我正在处理两个单独的列表,一个是字符串的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?"

作为更复杂的例子,假设我有 list_0list_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"

干杯:)

【问题讨论】:

  • list_0 中的字符串与list_1 的元素之间是否存在一对一的映射关系?那么,0.14 是“嘿”的参考数字吗?
  • it can't be a set as it's a translation of an audio file。我不明白这句话背后的逻辑。
  • 你的问题是什么?
  • @gaganso 感谢您的回复 - “0”是 item_0 的 ref_#,“1”是 item_1 的 ref_$。 Paul Rooney 我不能让列表保持唯一值,因为每个发言者都可以重复单词
  • @Hews,您能否提供您给出的示例的预期输出?

标签: python python-2.7 list sorting


【解决方案1】:

只需构建一个列表字典:

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

【讨论】:

  • 太棒了!非常感谢:)
  • 这不是假设列表的顺序相同吗?上面的评论说他们可能不是。
  • 是的,因为它们被压缩在一起。我不确定为什么不能使用子列表中的字符串并且不需要第一个列表。我想我正在等待澄清。如果子列表中的单词可以使用,去掉zip,dict赋值变成di.setdefault(l1[3],[]).append(l1[0])
【解决方案2】:

应该这样做:

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】:

    好的,所以我们有 list_0 以所需的顺序,但根据您的评论, list_1 不一定按任何特定顺序;唯一的办法 匹配它们是通过匹配字符串。这个问题可能应该 以这种方式排列数据,以明确这一点。

    这里出现了问题。例如,假设list_0 有这样的数据:

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

    并且,忽略无关的浮点数据,假设list_1 告诉我们reference_number_0 说了两次'yes',并且 reference_number_1 说一次'yes' 和一次'no'

    我们将如何判断reference_number_1 所说的顺序 单词?

    发言顺序可能是这样的:

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

    但也可能是这样的:

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

    没有办法判断哪个是正确的。所以,在一般情况下, 问题无法解决。

    【讨论】:

      猜你喜欢
      • 2021-02-23
      • 2018-03-01
      • 1970-01-01
      • 2019-08-27
      • 2023-03-17
      • 2015-10-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多