比较Python中的列表中的字符串和输出字符,直到它们相同

时间:2015-04-30 08:39:31

标签: python

如何比较列表中的所有字符串,例如:

"A-B-C-D-E-F-H-A", 
"A-B-C-F-G-H-M-P",

并输出直到哪个字符相同:

在上面的示例中,它将是:

Character 6

输出最相似的字符串。

我尝试过collections.Counter但是没有用。

2 个答案:

答案 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))
相关问题