计算两个字符串Python的字母差异

时间:2016-11-20 15:39:04

标签: python string

我在python中练习字符串时遇到了一些问题。

我有两个不同的列表:

list1= "ABCDEFABCDEF"

list2= "AZBYCXDWEVFABCDEF"

我需要根据它们的位置比较这两个列表,所以将1个字母放在一起,然后是2 ...使用最小长度(所以这里是list1的长度)并将字母存储在一个新变量中,如果它们是不同或相同。

identicals=[]
different=[]

我尝试编写某些东西,它似乎找到相同的东西,但不会对不同的东西起作用,因为它会多次复制它们。

for x in list1:
   for y in list2:
       if list1>list2:
           if x==y:
               identicals.append(x)
           if x!=y :
               different.append(x)          
       if list2>list1:
           if y==x:
               identicals.append(y)
           if y!=x:
               different.append(y)

我很感激一些帮助。

感谢。

编辑:输出结果应该是这样的:

identicals=['A']
different=["Z","B","Y","C","X","D","W","E","V",F","A"]

问题是字母A只显示在相同的字母上,但即使F!= A也没有显示。

3 个答案:

答案 0 :(得分:1)

您收到了不必要的重复项,因为您有一对嵌套的for循环,因此list2中的每个项目都会针对list1中的每个项进行测试。

关键思想是迭代 parallel 中的两个字符串。您可以使用内置的zip function执行此操作,它会从您提供的每个可迭代项中生成相应项目的元组,并在其中一个迭代项用完项目时立即停止。

从您的示例代码中,您似乎希望从较长的字符串中获取different列表的项目。为了有效地做到这一点,在开始循环之前找出哪个字符串是更长的

我已经重命名了你的字符串,因为让字符串的名称以" list"开头是令人困惑的。

s1 = "ABCDEFABCDEF"
s2 = "AZBYCXDWEVFABCDEF"

identicals = [] 
different = []

small, large = (s1, s2) if len(s1) <= len(s2) else (s2, s1)

for x, y in zip(small, large):
    if x == y:
        identicals.append(y)
    else:
        different.append(y)

print(identicals)
print(different)

<强>输出

['A']
['Z', 'B', 'Y', 'C', 'X', 'D', 'W', 'E', 'V', 'F', 'A']

我们可以以牺牲可读性为代价使for循环更紧凑。我们将目标列表放入元组中,然后使用相等性测试来选择要附加到该元组中的列表。这是有效的,因为False的数值为0,True的数值为1。

for x, y in zip(small, large):
    (different, identicals)[x == y].append(y)

答案 1 :(得分:0)

问题是内循环。您正在将list1中的每个字母与list2的所有字母进行比较。

相反,你应该有一个循环:

identicals=[] 
different=[]
short_list = list1 if len(list1)<= len(list2) else list2
for i in range(len(short_list):
    if list1[i] == list2[i]:
        identicals.append(list1[i])
    else:
        different.append(short_list[i])  

答案 2 :(得分:0)

试试这个

a = "ABCDEFABCDEF"
b = "AZBYCXDWEVFABCDEF"


import numpy
A = numpy.array(list(a))
B = numpy.array(list(b))
common = A[:len(B)] [ (A[:len(B)] == B[:len(A)]) ]
different = A[:len(B)] [ - (A[:len(B)] == B[:len(A)]) ]

>>> list(common)
['A']

>>> list(different)
['B', 'C', 'D', 'E', 'F', 'A', 'B', 'C', 'D', 'E', 'F']