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']