我有两个列表具有相同的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
,仅包含1s
,或包含0s
和1s
。
3)。 list2
仅包含长度相同的字符串,每个字符串k
(k
是索引>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
中的字符串进行分组(对应:list1
和list1
中的元素共享相同的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=0
和list1[4]==0
,list1[4+1]==0
保持不变。 'CCA'
和list1[5]==0
,然后list1[5+1]==0
保持不变。
改造后
这是我想要的输出。
list2[5]='CAA'
显然代码不正确。
newlist2=['ATTCCC', 'CCA', 'CAA', 'AAAG']
答案 0 :(得分:2)
您可以将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']
答案 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']
我遍历你的列表,应用你的方法,并跟踪我需要在最后删除哪些索引,然后我创建一个没有不必要索引的新列表。