代码之家  ›  专栏  ›  技术社区  ›  ShanZhengYang

基于条件匹配和重构Python中的一对字符串

  •  0
  • ShanZhengYang  · 技术社区  · 6 年前

    在Python3中有以下一对短字符串。x、 其长度必须相等:

    string_a = 'he_lo_world'
    string_b = 'hi_low_oldd'
    

    我想 尽快 根据以下规则,根据对中的字符匹配方式创建“摘要字符串”:

    (1) 如果字符相同,则新字母为S(相同)。除非匹配字符为 _ ,则为U(下划线)。

    (2) 否则,字符不匹配。如果不匹配,则字母为N(不匹配)。如果 string_a _ string_b 不是,是的 A 如果 字符串\u b _ 字符串\u a 不是,是的 B

    对于上面的一对,字符串应为:

    SNUSSABSNNS
    

    要构造这个字符串,我认为多个if/for语句效率太低。

    这里使用列表理解和itertools示例, Trying to find a match in two strings - Python

    import itertools
    string_a = 'he_lo_world'
    string_b = 'hi_low_oldd'
    
    same = [ i for i,x in enumerate(itertools.izip(string_a,string_b)) if all(y==x[0] for y in x)]
    
    print(same) ## [0, 2, 3, 4, 7, 10]
    

    我可以得到匹配的索引。(The _==_ 异常需要在列表理解中使用条件,因此上面不应存在索引2。)

    我很困惑(A)如何基于这个索引列表重新构造字符串,以及(B)如何有效地处理不匹配的字符?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ajax1234    6 年前

    您可以使用 zip :

    string_a = 'he_lo_world'
    string_b = 'hi_low_oldd'
    new_s = ''.join(['S', 'U'][a == '_'] if a == b else 'N' if a != '_' and b != '_' else ['A', 'B'][b == '_' and a != '_'] for a, b in zip(string_a, string_b))
    

    输出:

    'SNUSSABSNNS'