Python 对齐两个字符串:bigram/Buble

Python 对齐两个字符串:bigram/Buble,python,sorting,Python,Sorting,我正在尝试编写一个函数,如果两个字符串中的字符匹配,该函数允许我将两个字符串对齐 例如输入: 输出: ['H', 'o', 'u', 's', 'e'] ['H', 'o', 's'] 期望输出: ['H', 'o', 'u', 's', 'e'] ['H', 'o', ,'0','s', '0'] 我曾想过用气泡排序法或是用bigrams来做这件事,但我没有这方面的经验。 有人有什么建议吗?快速肮脏的方法: l1 = ['H', 'o', 'u', 's', 'e'] l2 = ['H

我正在尝试编写一个函数,如果两个字符串中的字符匹配,该函数允许我将两个字符串对齐

例如输入:

输出:

['H', 'o', 'u', 's', 'e'] ['H', 'o', 's']
期望输出:

['H', 'o', 'u', 's', 'e'] 
['H', 'o', ,'0','s', '0']
我曾想过用气泡排序法或是用bigrams来做这件事,但我没有这方面的经验。
有人有什么建议吗?

快速肮脏的方法:

l1 = ['H', 'o', 'u', 's', 'e'] 
l2 = ['H', 'o', 's']

l2, l1 = sorted((l1, l2), key=len)
l = len(l1)
j = 0

res = []
for i in range(l):
  try:
    if l1[i]==l2[j]:
      res.append(l1[i])
      j += 1
    else:
      res.append(None)    
  except IndexError:
    res.extend([None] * (l-j))
    break

print(res)  # -> ['H', 'o', None, 's', None]
请注意,需要澄清!(见@yatu的评论)

还请注意,我将您的
'0'
更改为
None
。使用
'0'
是个坏主意,因为至少在理论上,您的两个初始列表可能包含该内容,并且您将无法区分匹配和不匹配



我肯定期待着一个更优雅的方法来解决这个有趣的问题

您可以使用
for
循环和
if-else
来执行此操作。您只需要使用附加索引来跟踪较短的列表

list1 = ['H', 'o', 'u', 's', 'e']
list2 = ['H', 'o', 's']
list3 = []

j = 0
for i in range(len(list1)):
    if j < len(list2) and list1[i] == list2[j]:
        list3.append(list1[i])
        j += 1
    else:
        list3.append('0')
    i += 1

print(list3) # ['H', 'o', '0', 's', '0']
快速功能:

def my_func(l1, l2):
    consume_l2 = l2.copy()
    return [l2.pop(l2.index(c)) if c in l2 else '0' for c in l1]

l1 = ['H', 'o', 'u', 's', 'e']
l2 = ['H', 'o', 's']
print(my_func(l1, l2))
输出:

['H', 'o', '0', 's', '0']
如果不需要第二个列表,可以使用:

[l2.pop(l2.index(c)) if c in l2 else '0' for c in l1]

这里已经发布了一些很好的答案,但是,另一种可能性是使用一个类:

class Track:
   def __init__(self, v):
      self.v = iter(v)
   def __getitem__(self, val):
      self.v = self.v if (r:=next(self.v, None)) is None or r == val else iter([r, *self.v])
      return '0' if r != val else r

d1, d2 = ['H', 'o', 'u', 's', 'e'], Track(['H', 'o', 's'])
result = [d2[i] for i in d1]
输出:

['H', 'o', '0', 's', '0']

如果两个字符串中的字符都匹配
,您能更精确些吗?他们中有多少人?如果第二个列表是
['H','s','o']
,则允许对列表进行排序?我的意思是,例如,如果每个字符串的前两个字符相同。
['H', 'o', '0', 's', '0']