【发布时间】:2018-06-04 12:36:06
【问题描述】:
在一些 NLP 任务中,我有一个嵌套的字符串列表:
[['Start', 'двигаться', 'другая', 'сторона', 'света', 'надолго', 'скоро'],
['Start', 'двигаться', 'другая', 'сторона', 'света', 'чтобы', 'посмотреть'],
['Start', 'двигаться', 'новая', 'планета'],
['Start', 'двигаться', 'сторона', 'признание', 'суверенитет', 'израильский'],
['Start', 'двигаться', 'сторона', 'признание', 'высот', 'на'],
['Start', 'двигаться', 'сторона', 'признание', 'высот', 'оккупировать'],
['Start', 'двигаться', 'сторона', 'признание', 'высот', 'Голанский'],
['Start', 'двигаться', 'сторона', 'признание', 'и']]
我需要一种算法来找到两个或更多元素,这些元素对于两个或更多子列表很常见,并从中生成单个元素。在我的示例中,'Start', 'двигаться' 对所有元素都是通用的,因此它应该成为单个字符串。 'сторона', 'света', 'надолго' 对于两个元素是通用的,所以它变成了单个字符串。 'сторона', 'признание' 常见于 5 个元素,因此它变成单个字符串。如果没有剩余的公共元素,只需将其余元素添加为单个字符串。
期望的输出:
[['Start двигаться', 'другая сторона света', 'надолго скоро'],
['Start двигаться', 'другая сторона света', 'чтобы посмотреть'],
['Start двигаться', 'новая планета'],
['Start двигаться', 'сторона признание', 'суверенитет израильский'],
['Start двигаться', 'сторона признание', 'высот на'],
['Start двигаться', 'сторона признание', 'высот оккупировать'],
['Start двигаться', 'сторона признание', 'высот Голанский'],
['Start двигаться', 'сторона признание', 'и']]
到目前为止,我尝试了一些循环和元素比较:
for elem,next_elem in zip(lst, lst[1:]+[lst[0]]):
if elem[0] == next_elem[0] and elem[1] == next_elem[1] and elem[2] == next_elem[2]:
elem[0:3] = [' '.join(elem[0:3])]
if elem[0] == next_elem[0] and elem[1] == next_elem[1]:
elem[0:2] = [' '.join(elem[0:2])]
但我认为这不是正确的方法。集合也不是一种选择,因为子列表中的一个元素可以多次出现。 我检查了其他 LCS 主题,但没有找到解决方案。任何可以完成这项工作的工作算法都会很棒,目前效率并不重要。更多示例:
[[a,b,c,d],
[a,b,d,e,f]]
应该变成:
[[ab,cd],
[ab,def]]
由于a,b 是公共元素,而cd, def 只是成为单个元素。
[[a,b,c,d,e,g],
[a,b,c,d,g,h],
[a,b,h,h,i]]
应该变成:
[[ab,cd,eg],
[ab,cd,gh],
[ab,hhi]]
因为ab 和cd 是两个或多个子列表的大炮
还有:
[[a,b,c],
[a,b,d]]
变成:
[[ab, c],
[ab, d]]
由于c, d 不是常见元素
【问题讨论】:
-
看here。
-
如果你有
[[a, b], [a, b, c], [b, c]]怎么办?还有,为什么'и'之前加入了字符串,而'высот'没有加入? -
@tobias_k 感谢您的回复!在这种情况下,输出将是
[[a b], [a b c], [b c]],因为“c”将是单个左侧元素,应该添加到前一个序列中,而“b c”是唯一元素。
标签: python python-3.x algorithm list lcs