避免嵌套两个for循环

for*_*unk 2 python for-loop

请看下面的代码:

import string
from collections import defaultdict



first_complex=open( "residue_a_chain_a_b_backup.txt", "r" )
first_complex_lines=first_complex.readlines()
first_complex_lines=map( string.strip, first_complex_lines )
first_complex.close()

second_complex=open( "residue_a_chain_a_c_backup.txt", "r" )
second_complex_lines=second_complex.readlines()
second_complex_lines=map( string.strip, second_complex_lines )
second_complex.close()
list_1=[]
list_2=[]
for x in first_complex_lines:
    if x[0]!="d":
        list_1.append( x )
for y in second_complex_lines:
    if y[0]!="d":
        list_2.append( y ) 
j=0
list_3=[]      
list_4=[]
for a in list_1:
    pass
    for b in list_2:
        pass
        if a==b:
            list_3.append( a )    

kvmap=defaultdict( int )
for k in list_3:
    kvmap[k]+=1 
print kvmap
Run Code Online (Sandbox Code Playgroud)

通常我使用izip或izip_longest来为两个循环播放,但这次文件的长度是不同的.我不想要一个无条目.如果我使用上述方法,则运行时间变为增量且无用.我怎么能让两个for循环去?

干杯,Chavanak

jcd*_*yer 8

您想要转换list_2为集合,并检查成员身份:

list_1 = ['a', 'big', 'list']
list_2 = ['another', 'big', 'list']

target_set = set(list_2)

for a in list_1:
    if a in target_set:
         print a
Run Code Online (Sandbox Code Playgroud)

输出:

big
list
Run Code Online (Sandbox Code Playgroud)

集合为您提供了O(1)访问时间来确定成员资格的优势,因此您只需要list_2一次读取(创建集合时).此后,每次比较都在恒定时间内发生.