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']}
Другие вопросы по тегам