我在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也没有显示。
答案 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']