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

python在列表中分组字符串

  •  0
  • JY078  · 技术社区  · 8 年前

    我有两个相同的列表 len

    list1=[0, 1, 1, 1, 0, 0, 0, 1]
    list2=['ATT', 'TTC', 'TCC', 'CCC', 'CCA', 'CAA', 'AAA', 'AAG']
    

    注:

    1) 。每个列表中的元素数量各不相同,但两个列表始终具有相同的元素 len公司

    2) 。 list1 仅包含整数 0 1 。它只能包含 0 s、 仅包含 1s ,或同时包含两者 0s 1秒

    3) 。 list2 仅包含长度相同的字符串,也包括每个字符串 k ( k 是索引 >0 ),则, list2[k][:-1]=list2[k-1][1:] ,意味着如果 k=2, list[k]='TCC', list[k][:-1]='TC', list[k-1]='TTC', list[k-1][1:]='TC' 。因此 列表2[k][:-1]=列表2[k-1][1:]

    我想将字符串分组 列表2 基于其在 列表1 (对应:中的元素 列表1 列表2 共享相同的 index )。如果 list1[n]==1 然后 list2[n-1]+list2[n][-1] 。如果 list1[n]==0, and list1[n+1]==0, do nothing

    e、 g.中第一个整数1的对应字符串 列表2 'TTC' 然后 'ATT' 'TTC' 成为 'ATTC' 。列表2中第二个整数1的对应字符串为 'TCC' 然后 '附件' (注:已合并),以及 '变矩器离合器' 成为 'ATTCC' 。然后 list1[3]==1 ,则, 'ATTCC' 'CCC' 成为 'ATTCCC' list1[7]==1 然后 'AAG' ('AAG'=list2[7]) 需要与其前一个字符串分组, 'AAA' ,两者成为 'AAAG' 。你什么都不做的唯一条件是 n=0 n+1=0 。这就是为什么, list1[4]==0 list1[4+1]==0 ,则, 'CCA' 保持不变。 list1[5]==0 list1[5+1]==0 然后 list2[5]='CAA' 保持不变。

    改造后, 这是我想要的输出。 newlist2=['ATTCCC', 'CCA', 'CAA', 'AAAG']

    显然,代码不正确。

    for i in range(1, len(list1)):
        if list1[i]==1:
            newlist2[i-1]+newlist2[i][-1]  
        else:
            do nothing
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   user3483203    8 年前

    这就是你想要的吗

    list1=[0, 1, 1, 1, 0, 0, 0, 1]
    list2=['ATT', 'TTC', 'TCC', 'CCC', 'CCA', 'CAA', 'AAA', 'AAG']
    
    indices = []
    for i in range(1, len(list1)):
        if list1[i]==1:
            list2[i] = list2[i-1]+list2[i][-1]
            indices.append(i-1)
    
    
    list2 = [list2[i] for i in range(len(list2)) if i not in indices]
    print(list2)
    

    输出:

    ['ATTCCC', 'CCA', 'CAA', 'AAAG']
    

    我循环浏览您的列表,应用您的方法,并在最后跟踪需要删除的索引,然后创建一个没有不必要索引的新列表。

        2
  •  2
  •   Ajax1234    8 年前

    您可以使用 itertools.groupby 具有 functools.reduce :

    import itertools
    import functools
    list1=[0, 1, 1, 1, 0, 0, 0, 1]
    list2=['ATT', 'TTC', 'TCC', 'CCC', 'CCA', 'CAA', 'AAA', 'AAG']
    d = [[a, [h for _, h in b]] for a, b in itertools.groupby(zip(list1, list2), key=lambda x:x[0])]
    final_results = [i for b in filter(None, [[functools.reduce(lambda x, y:x+y[-1], [d[i-1][-1][-1]]+d[i][-1])] if d[i][0] else d[i][-1][:-1] for i in range(len(d))]) for i in b]
    

    输出:

    ['ATTCCC', 'CCA', 'CAA', 'AAAG']