首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中嵌套while循环的问题

问Python中嵌套while循环的问题
EN

Stack Overflow用户
提问于 2021-01-19 22:48:36
回答 2查看 65关注 0票数 1

我有两个名字列表,names_1和names_2,它们都有相同的长度( 1000 ),没有列表有重复的名字,每个列表包含1000个唯一的名字,但有些名字出现在两个列表中,我想在第三个列表dup_names中隔离出现在两个列表中的名字,并从原始列表中删除它们,我尝试了以下代码,但它不起作用:

代码语言:javascript
复制
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)值之间的比较,输出是:

代码语言:javascript
复制
(0,0)
(0,1)
.
.
.
(0,999)
len(COMPARED) = 1000
len(dup_names) = 0
len(names_1) = 1000
len(names_2) = 1000

从打印出来的i_k_pairs中,我看到它只比较了names_1 (i=0)中的第一个名字和names_2中的所有名字,因为len(dup_names) = 0,len(names_1) = 1000和len(names_2) = 1000,我解释了那个len(COMPARED) = 1000000,但它看起来是but循环的问题,有人能解释一下我有什么问题吗?!?!

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

代码语言:javascript
复制
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循环有问题吗?

EN

回答 2

Stack Overflow用户

发布于 2021-01-19 23:38:09

这是在比较两个列表中的重复项,而不是比较names_1中已经比较过的任何东西。我认为可能有一个很好的优化过的列表。如果你想比较两个列表len( names_1 )时间len( names_2 ),最好避免从names_1和names_2中删除元素。你的代码不能工作的原因是,你的代码没有重置i=0以在第二个while循环之后从头开始启动names_1。

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2021-01-19 22:57:07

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

代码语言:javascript
复制
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]
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65793865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档