Python: добавление целых элементов вложенного списка в список
Итак, у меня есть два списка, целочисленные элементы которых необходимо добавить.
nested_lst_1 = [[6],[7],[8,9]]
lst = [1,2,3]
Мне нужно добавить их так, чтобы каждый элемент во вложенном списке был добавлен к соответствующему целому числу в 'lst', чтобы получить другой вложенный список.
nested_list_2 = [[6 + 1],[7 + 2],[8 + 3,9 + 3]]
или же
nested_list_2 = [[7],[9],[11,12]]
Затем мне нужно использовать целые числа из nested_list_1 и nested_list_2 в качестве индексов для извлечения подстроки из строки.
nested_list_1 = [[6],[7],[8,9]] *obtained above*
nested_list_2 = [[7],[9],[11,12]] *obtained above*
string = 'AGTCATCGTACGATCATCGAAGCTAGCAGCATGAC'
string[6:7] = 'CG'
string[7:9] = 'GTA'
string[8:11] = 'TACG'
string[9:12] = 'ACGA'
Затем мне нужно создать вложенный список полученных подстрок:
nested_list_substrings = [['CG'],['GTA'],['TACG','ACGA']]
Наконец, мне нужно использовать эти подстроки в качестве значений ключей в словаре, который также обладает ключами типа string.
keys = ['GG', 'GTT', 'TCGG']
nested_list_substrings = [['CG'],['GTA'],['TACG','ACGA']]
DNA_mutDNA = {'GG':['CG'], 'GTT':['GTA'], 'TCGG':['TACG','ACGA']}
Я понимаю, что это многоэтапная проблема, но если вы могли бы помочь в любом случае, я действительно ценю это.
4 ответа
Предполагая, что вам не нужны промежуточные переменные, вы можете сделать все это с помощью словарного понимания:
a = [[6],[7],[8,9]]
b = [1,2,3]
keys = ['GG', 'GTT', 'TCGG']
s = 'AGTCATCGTACGATCATCGAAGCTAGCAGCATGAC'
DNA_mutDNA = {k: [s[start:start+length+1] for start in starts]
for k, starts, length in zip(keys, a, b)}
Вы можете создать список подстрок непосредственно с пониманием вложенного списка, nested_lst_2
не обязательно
nested_lst_1 = [[6],[7],[8,9]]
lst = [1,2,3]
string = 'AGTCATCGTACGATCATCGAAGCTAGCAGCATGAC'
keys = ['GG', 'GTT', 'TCGG']
substrings = [[string[v:i+v+1] for v in u] for i, u in zip(lst, nested_lst_1)]
print(substrings)
DNA_mutDNA = dict(zip(keys, substrings))
print(DNA_mutDNA)
выход
[['CG'], ['GTA'], ['TACG', 'ACGA']]
{'GG': ['CG'], 'GTT': ['GTA'], 'TCGG': ['TACG', 'ACGA']}
Конечно, не самый читаемый способ сделать это, вот немного функционального стиля забавы:
nested_lst_1 = [[6], [7], [8,9]]
lst = [1, 2, 3]
nested_lst_2 = list(map(
list,
map(map, map(lambda n: (lambda x: n+x), lst), nested_lst_1)))
nested_lst_2
Результат выглядит как и ожидалось:
[[7], [9], [11, 12]]
Затем:
from itertools import starmap
from operator import itemgetter
make_slices = lambda l1, l2: starmap(slice, zip(l1, map(lambda n: n+1, l2)))
string = 'AGTCATCGTACGATCATCGAAGCTAGCAGCATGAC'
get_slice = lambda s: itemgetter(s)(string)
nested_list_substrings = list(map(
lambda slices: list(map(get_slice, slices)),
starmap(make_slices, zip(nested_lst_1, nested_lst_2))))
nested_list_substrings
Результат:
[['CG'], ['GTA'], ['TACG', 'ACGA']]
И наконец:
keys = ['GG', 'GTT', 'TCGG']
DNA_mutDNA = dict(zip(keys, nested_list_substrings))
DNA_mutDNA
Конечный результат:
{'GG': ['CG'], 'GTT': ['GTA'], 'TCGG': ['TACG', 'ACGA']}
In[2]: nested_lst_1 = [[6],[7],[8,9]]
...: lst = [1,2,3]
...: string = 'AGTCATCGTACGATCATCGAAGCTAGCAGCATGAC'
...: keys = ['GG', 'GTT', 'TCGG']
In[3]: nested_lst_2 = [[elem + b for elem in a] for a, b in zip(nested_lst_1, lst)]
In[4]: nested_list_substrings = []
...: for a, b in zip(nested_lst_1, nested_lst_2):
...: nested_list_substrings.append([string[c:d + 1] for c, d in zip(a, b)])
...:
In[5]: {k: v for k, v in zip(keys, nested_list_substrings)}
Out[5]: {'GG': ['CG'], 'GTT': ['GTA'], 'TCGG': ['TACG', 'ACGA']}