列表中的python组字符串

时间:2018-03-11 01:27:15

标签: python string list grouping

我有两个列表具有相同的len

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

注意:

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

2)。 list1仅包含整数01。它只能包含0,仅包含1s,或包含0s1s

3)。 list2仅包含长度相同的字符串,每个字符串kk是索引>0),list2[k][:-1]=list2[k-1][1:],意味着{{1} }}。因此,k=2, list[k]='TCC', list[k][:-1]='TC', list[k-1]='TTC', list[k-1][1:]='TC'

我想根据list2[k][:-1]=list2[k-1][1:]中的相应元素对list2中的字符串进行分组(对应:list1list1中的元素共享相同的list2 )。如果是index,那么list1[n]==1。如果list2[n-1]+list2[n][-1]

e.g。 list1[n]==0, and list1[n+1]==0, do nothing中第一个整数1的对应字符串为list2,然后'TTC''ATT'变为'TTC'。 list2中第二个整数1的对应字符串为'ATTC',然后是'TCC'(注意;已合并),'ATTC'变为'TCC'。然后'ATTCC'list1[3]==1'ATTCC'成为'CCC''ATTCCC',然后list1[7]==1需要与之前的字符串'AAG' ('AAG'=list2[7])分组,两者成为'AAA'。您什么都不做的唯一条件是'AAAG'n=0。这就是为什么,n+1=0list1[4]==0list1[4+1]==0保持不变。 'CCA'list1[5]==0,然后list1[5+1]==0保持不变。

改造后 这是我想要的输出。 list2[5]='CAA'

显然代码不正确。

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

2 个答案:

答案 0 :(得分:2)

您可以将itertools.groupbyfunctools.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']

答案 1 :(得分:2)

这是你想要的吗?:

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']

我遍历你的列表,应用你的方法,并跟踪我需要在最后删除哪些索引,然后我创建一个没有不必要索引的新列表。