Python中嵌套while循环的问题

2024-09-30 10:29:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)值之间的比较,结果是:

(0,0)
(0,1)
.
.
.
(0,999)
len(COMPARED) = 1000
len(dup_names) = 0
len(names_1) = 1000
len(names_2) = 1000

从打印出来的i_k_对中,我看到它只比较了names_1{}中的第一个名字和names_2中的所有名字,因为len(dup_names) = 0len(names_1) = 1000len(names_2) = 1000,我认为len(COMPARED) = 1000000但是看起来这是一个外环的问题,有人能解释一下我的问题吗

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

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循环有问题吗


Tags: 代码in名称列表newforlenif
2条回答

使用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中已比较的任何内容。我认为可能会有一个很好的优化。如果要比较两个列表len(names_1)乘以len(names_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))

相关问题 更多 >

    热门问题