在列表中查找最常见的子站点

时间:2016-07-24 17:58:42

标签: python list for-loop substring

我有很长的子列表,我想搜索并查找两个特定子序列出现的次数。以下代码是我开始的:

dataA = ['0000000001001000',
'0000000010010001',
'0000000100100011',
'0000001001000100',
'0000010010001010',
'0000100100010100',
'0001001000101011',
'0010010001010110']
A_vein_1 = [0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0]
joined_A_Search_1 = ''.join(map(str,A_vein_1))
print 'search 1', joined_A_Search_1
A_vein_2 = [0,0,0,1,0,0,1,0,0,0,1,0,1,0,1]
joined_A_Search_2 = ''.join(map(str,A_vein_2))
print 'search 2', joined_A_Search_2
match_A = []    #empty list to append closest match to
#Match search algorithm
for text in dataA:
    if joined_A_Search_1 == text:
        if joined_A_Search_2 == dataA[text+1[:-1]]:
        print 'logic stream 1'
        match_A.append(dataA[text+1[-1]])    
if joined_A_Search_2 == text[:-1]:
    print 'logic stream 2'
    #print 'match', text[:-1]
    match_A.append(text[-1])
print 'matches', match_A
try:
    filter_A = max(set(match_A), key=match_A.count) #finds most frequent
except:
    filter_A = 0 #defaults 0
    print 'no match A'
filter_A = int(filter_A)
print '0utput', filter_A

值得注意的是,A_vein_1长度为16个字符,A_vein_2长度仅为15个章程,因此是搜索的原因。我遇到麻烦的是:

 if joined_A_Search_2 == dataA[text+1[:-1]]:

我想要做的是查找A_vein_1,如果它在那里,请查看其下的下一个序列以查看前15个章程是否与A_vein_2匹配,如果是,则附加到列表,如果不是,则仅搜索A_vein_2。如果找不到,则默认为零。我相信我有正确的想法,但这个if语句的语法错误。我过去几个月一直在学习Python,所以我还不是很精通。请注意,dataA已缩短,并且A_veins已被手动替换以用于此帖子,并且打印用于跟踪错误。

1 个答案:

答案 0 :(得分:0)

我认为你想要的是以下内容。听起来你想在匹配第一次搜索后检查下一个项目。

for i,text in enumerate(dataA):
    if joined_A_Search_1 == text:
        if joined_A_Search_2 == dataA[i+1][:-1]:
            print 'logic stream 1'
            match_A.append(dataA[i+1][-1])    

enumerate返回您正在迭代的索引和内容,因此要检查您可以执行的下一项dataA[i+1]。您需要处理匹配最后一项的第一次搜索的条件,因为data[i+1]未定义,但这可以帮助您实现您想要的。