如何比较列表中的所有字符串,例如:
"A-B-C-D-E-F-H-A",
"A-B-C-F-G-H-M-P",
并输出直到哪个字符相同:
在上面的示例中,它将是:
Character 6
输出最相似的字符串。
我尝试过collections.Counter但是没有用。
答案 0 :(得分:3)
你试图在锁步中的两个字符串中逐个字符。这是zip
的工作:
A = "A-B-C-D-E-F-H-A"
B = "A-B-C-F-G-H-M-P"
count = 0
for a, b in zip(A, B):
if a == b:
count += 1
else:
break
或者,如果您更喜欢“......只要他们......”就是takewhile
的工作:
from itertools import takewhile
from operator import eq
def ilen(iterable): return sum(1 for _ in iterable)
count = ilen(takewhile(lambda ab: eq(*ab), zip(A, B)))
如果您有这些字符串的列表,并且希望将每个字符串与每个其他字符串进行比较:
首先,将上面的代码转换为函数。我会用itertools版本来做,但是你可以用另一个同样容易地做到这一点:
def shared_prefix(A, B):
return ilen(takewhile(lambda ab: eq(*ab), zip(A, B)))
现在,对于每个字符串,您将其与所有其余字符串进行比较。使用combinations
:
from itertools import combinations
counts = [shared_prefix(pair) for pair in combinations(list_o_strings, 2)]
但如果您不理解,可以将其编写为嵌套循环。唯一棘手的部分是“其余字符串”的含义。你不能在外部循环和内部循环中遍历所有字符串,或者你将每对字符串比较两次(每个顺序一次),并将每个字符串与自身进行比较。所以它必须意味着“当前一个之后的所有字符串”。像这样:
counts = []
for i, s1 in enumerate(list_o_strings):
for s2 in list_o_strings[i+1:]:
counts.append(prefix(s1, s2))
答案 1 :(得分:0)
我认为此代码可以解决您的问题。
listA = "A-B-C-D-E-F-H-A"
listB = "A-B-C-F-G-H-M-P"
newListA = listA.replace ("-", "")
newListB = listB.replace ("-", "")
# newListA = "ABCDEFHA"
# newListB = "ABCFGHMP"
i = 0
exit = 0
while ((i < len (newListA)) & (exit == 0)):
if (newListA[i] != newListB[i]):
exit = 1
i = i + 1
print ("Character: " + str(i))