Python中嵌套while循环的问题

Python中嵌套while循环的问题,python,while-loop,nested,Python,While Loop,Nested,我有两个名称列表,名称_1和名称_2,它们的长度都相同1000,没有列表有重复的名称,每个列表包含1000个唯一的名称,但有些名称出现在两个列表中,我想在第三个重复名称列表中隔离两个列表中出现的名称,并将其从原始列表中删除,我尝试了以下代码,但无效: dup_names=[] m=len(names_1) i=0 k=0 COMPARED=[] while i<m: while k<m: COMPARED.append((i,k)) if na

我有两个名称列表,名称_1和名称_2,它们的长度都相同1000,没有列表有重复的名称,每个列表包含1000个唯一的名称,但有些名称出现在两个列表中,我想在第三个重复名称列表中隔离两个列表中出现的名称,并将其从原始列表中删除,我尝试了以下代码,但无效:

dup_names=[]
m=len(names_1)
i=0
k=0
COMPARED=[]
while i<m:
    while k<m:
        COMPARED.append((i,k))
        if names_1[i]==names_2[k]:
            dup_names.append(names_1[i])
            names_1[i:i+1]=[]
            names_2[k:k+1]=[]
            m=m-1
            k=0
        else:
            k=k+1
    i=i+1

for i_k_pair in COMPARED:
    print(i_k_pair)

print('len(COMPARED) =',len(COMPARED))
print('len(dup_names) =',len(dup_names))
print('len(names_1) =',len(names_1))
print('len(names_1) =',len(names_2))
从打印出来的i_k_对中,我看到它只比较了names_1 i=0中的第一个名字和names_2中的所有名字,因为lendup_names=0,lennames_1=1000和lennames_2=1000,我排除lenCOMPARED=1000000,但看起来这是outed循环的问题,有人能解释一下我出了什么问题吗

我知道我可以用以下代码完成这项工作:

dup_names=[]
for i in range(len(names_1)):
    for k in range(len(names_2)):
        if names_1[i]==names_2[k]:
            dup_names.append(names_1[i])

new_names_1=[]
new_names_2=[]
for n in range(len(names_1)):
    s1=0
    s2=0
    for m in range(len(dup_names)):
        if names_1[n]==dup_names[m]:
            s1=1
        if names_2[n]==dup_names[m]:
            s2=1
    if s1==0:
        new_names_1.append(names_1[n])
    if s2==0:
        new_names_2.append(names_2[n])

names_1=new_names_1
names_2=new_names_2

del new_names_1,new_names_2
我尝试了这段代码,效果很好,但真正让我困惑的是: 第一个代码有什么问题??? 为什么外部while循环不工作?!
Python中的嵌套while循环有问题吗?

使用Pythonic方法和set来解决您的问题

x = ["C++", "C", "Python"]
y = ["Java", "C"]
z = set(x).intersection(set(y))
x = [elt for elt in x if elt not in z]
y = [elt for elt in y if elt not in z]

这是比较两个列表中的重复项,而不会比较名称_1中已比较的任何内容。我认为可能会有一个很好的优化。如果要比较两个列表lennames_1乘以lennames_2,最好避免从names_1和names_2中删除元素。代码不起作用的原因是,代码没有在第二个while循环后重新设置i=0以从头开始名称_1

dup_names=[]
names_1=["a","b","c","d","e"]
names_2=["f","g","h","a","d"]
m=len(names_1)
n=len(names_2)
i=0
k=0
COMPARED=[]
while i<m:
    matched_any = False
    while k<n:
        COMPARED.append((i,k))
        if names_1[i]==names_2[k]:
            dup_names.append(names_1[i])
            names_1[i:i+1]=[]
            names_2[k:k+1]=[]
            matched_any = True
            break
        else:
            k=k+1
    i=0
    k=0
    if not matched_any:
        names_1[i:i+1]=[]
    m=len(names_1)
    n=len(names_2)

for i_k_pair in COMPARED:
    print(i_k_pair)

print('len(COMPARED) =',len(COMPARED))
print('len(dup_names) =',len(dup_names))
print('len(names_1) =',len(names_1))
print('len(names_1) =',len(names_2))

您可以考虑使用方便的集合——使用SET从两个列表中找到常见项。intersection@jwjhdev这将只删除表中的1条记录,即第i条记录,而不是使用:names_1[i:i+1]=[],您可能应该使用names.popi。另外,python中嵌套的while循环肯定没有什么问题。任何时候,当你认为语言不通时,你都应该到外面呼吸新鲜空气:为什么你要用两个while循环来解决问题,而你用的是for循环呢?它们怎么了?@Daniel Hao谢谢,这是一个非常好的主意,但我想了解嵌套的while循环有什么问题,以及它们为什么不能正常工作。这不是问题的目的……而是一个解决方案。“这是可行的。”托马斯克林格说,但这不是一个解决办法,因为它不能回答问题。OP承认还有其他更好的方法可以做到这一点。问题是帮助我理解为什么这个代码不起作用,而不是给我t3h codez
dup_names=[]
names_1=["a","b","c","d","e"]
names_2=["f","g","h","a","d"]
m=len(names_1)
n=len(names_2)
i=0
k=0
COMPARED=[]
while i<m:
    matched_any = False
    while k<n:
        COMPARED.append((i,k))
        if names_1[i]==names_2[k]:
            dup_names.append(names_1[i])
            names_1[i:i+1]=[]
            names_2[k:k+1]=[]
            matched_any = True
            break
        else:
            k=k+1
    i=0
    k=0
    if not matched_any:
        names_1[i:i+1]=[]
    m=len(names_1)
    n=len(names_2)

for i_k_pair in COMPARED:
    print(i_k_pair)

print('len(COMPARED) =',len(COMPARED))
print('len(dup_names) =',len(dup_names))
print('len(names_1) =',len(names_1))
print('len(names_1) =',len(names_2))