【问题标题】:List of sub-strings search returns multiple conditions at once子字符串列表搜索一次返回多个条件
【发布时间】:2016-07-25 13:37:46
【问题描述】:

我有一个很大的子字符串列表,我想搜索并查找是否可以连续找到两个特定的子字符串。该逻辑旨在查找第一个序列,如果找到,则查看第二个子字符串并返回所有匹配项(基于 16 个字符序列的前 15 个字符)。如果第一个序列找不到,它只寻找第二个序列,最后,如果找不到,默认为零。然后将匹配项附加到一个列表中,该列表将被进一步处理。目前使用的代码如下:

dataA = ['0100101010001000',
'1001010100010001',
'0010101000100010',
'0101010001000110',
'1010100010001110',
'0101000100011100',
'1010001000111010',
'0100010001110100',
'1000100011101000',
'0001000111010000']
A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
joined_A_Search_1 = ''.join(map(str,A_vein_1))
print 'search 1', joined_A_Search_1
A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
joined_A_Search_2 = ''.join(map(str,A_vein_2))
match_A = []    #empty list to append closest match to
#Match search algorithm
for i,text in enumerate(data):
    if joined_A_Search_1 == text:
       if joined_A_Search_2 == data[i+1][:-1]:
            print 'logic stream 1'
            match_A.append(data[i+1][-1])
    if joined_A_Search_1 != text:
        if joined_A_Search_2 == text[:-1]:
            print 'logic stream 2'
            #print 'match', text[:-1]
            match_A.append(text[-1])
print ' A matches', match_A
try:
    filter_A = max(set(match_A), key=match_A.count)
except:
    filter_A = 0
    print 'no match A'
filter_A = int(filter_A)
print '0utput', filter_A

问题是我得到了逻辑流 1 和逻辑流 2 的返回,而我实际上希望它是严格的一个或另一个,在这种情况下只有逻辑流 1。输出示例如下这个:

search 1 0100101010001000
search 2 100101010001000
logic stream 1
logic stream 2
logic stream 1
logic stream 2
logic stream 2

(注意:列表已缩短,数据输入已直接替换,以及用于本文和错误跟踪目的的打印输出)

【问题讨论】:

    标签: python list if-statement for-loop substring


    【解决方案1】:

    输入:

    dataA = ['0100101010001000',
    '1001010100010001',
    '0010101000100010',
    '0101010001000110',
    '1010100010001110',
    '0101000100011100',
    '1010001000111010',
    '0100010001110100',
    '1000100011101000',
    '0001000111010000']
    A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
    A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
    

    代码:

    av1_str = "".join(map(str,A_vein_1))
    av2_str = "".join(map(str,A_vein_2))
    
    y=[av1_str,av2_str]
    
    print [(y,dataA.index(x)) for x in dataA for y in dataB if y in x]
    

    输出:

    [('0100101010001000', 0), ('100101010001000', 0), ('100101010001000', 1)]
    

    【讨论】:

      【解决方案2】:

      你的代码让我很困惑。但我想我理解你的问题:

      #!/usr/env/env python
      
      dataA = ['0100101010001000',
      '1001010100010001',
      '0010101000100010',
      '0101010001000110',
      '1010100010001110',
      '0101000100011100',
      '1010001000111010',
      '0100010001110100',
      '1000100011101000',
      '0001000111010000']
      A_vein_1 = [0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
      A_vein_2 = [1,0,0,1,0,1,0,1,0,0,0,1,0,0,0]
      
      av1_str = "".join(map(str,A_vein_1))
      av2_str = "".join(map(str,A_vein_2))
      
      for i, d in enumerate(dataA):
          if av1_str in d:
              print av1_str, 'found in line', i
          elif av2_str in d:
              print av2_str, 'found in line', i
      

      这给了我:

      jcg@jcg:~/code/python/stack_overflow$ python find_str.py
      0100101010001000 found in line 0
      100101010001000 found in line 0
      100101010001000 found in line 1
      

      编辑为 elif 后:

      jcg@jcg:~/code/python/stack_overflow$ python find_str.py
      0100101010001000 found in line 0
      100101010001000 found in line 1
      

      【讨论】:

      • 此代码的目的是找出第二个序列缺少的最后一位数字是什么(因此底部的最大计数代码)。当两个逻辑流都对列表 filter_A 有贡献时,就会失去准确性。这就是为什么它需要严格的一种情况或另一种情况。我想它可以被认为是一种或门类型的逻辑。
      猜你喜欢
      • 2019-01-31
      • 2012-03-30
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多