Как объединить список строк со списком целых чисел - PullRequest
0 голосов
/ 11 ноября 2018

Я хотел бы объединить следующий список строк и список целых списков:

lst = ['A', 
       'A', 
       'B', 
       'C', 
       'C', 
       'D', 
       'D', 
       'D',....]

lst_of_lst = [[9, 10, 11, 12],
              [54, 55, 56],
              [72, 73, 74, 75, 76], 
              [1, 2, 3, 4, 5],
              [98, 99, 100],
              [13, 14],
              [21, 22, 23],
              [27, 28, 29, 30], ....]

такой, что возвращается список кортежей:

lst_tups = [('A', 9), ('A', 10), ('A', 11), ('A', 12),
            ('A', 54), ('A', 55), ('A', 56), 
            ('B', 72), ('B', 73), ('B', 74), ('B', 75), ('B', 76),
            ('C', 1), ('C', 2), ('C', 3), ('C', 4), ('C', 5), 
            ('C', 98), ('C', 99), ('C', 100), 
            ('D', 13), ('D', 14),
            ('D', 21), ('D', 22), ('D', 23),
            ('D', 27), ('D', 28), ('D', 29), ('D', 30), ....]

2 списка имеют одинаковое количество элементов списка (в тестовом примере выше - 8). К сожалению, об использовании словарной стратегии не может быть и речи из-за повторяющихся строковых записей в lst.

Я пробовал следующее, которое работает только для первого элемента каждого подсписка в lst_of_lst и повторяется для каждой строки в lst:

empty_test_combo = []
for x in helix_chain_id:
    for y in helix_seq_res_num_ranges:
        empty_test_combo += (zip(x, y))

Я также пробовал:

lst_tups = []
for x in lst:
    for y in lst_of_lst:
        for z in y:
            lst_tups.append(zip(x, [z]))

Это кажется наиболее перспективным вариантом. Он возвращает список кортежей, который правильно комбинирует строки lst и целые списки lst_of_lst, но только частично.

1 Ответ

0 голосов
/ 11 ноября 2018

Похоже, что вы пытаетесь использовать zip.

, неправильно понимаете

zip(list1, list2) - итератор. Когда вы выполняете итерацию, вы получаете кортежи: первый состоит из первого элемента list1, первого элемента list2 и т. Д.

Здесь вы хотите zip(lst, lst_of_lst), чтобы связать каждый элемент lst с соответствующим подсписком lst_of_lst. Из каждой пары вы можете генерировать желаемый результат.

Вы можете сделать это с пониманием списка:

lst = ['A', 'A', 'B', 'C', 'C', 'D', 'D', 'D',]

lst_of_lst = [[9, 10, 11, 12],
              [54, 55, 56],
              [72, 73, 74, 75, 76], 
              [1, 2, 3, 4, 5],
              [98, 99, 100],
              [13, 14],
              [21, 22, 23],
              [27, 28, 29, 30],]


out = [(item1, item2) for item1, sublist in zip(lst, lst_of_lst) for item2 in sublist]

print(out)
# [('A', 9), ('A', 10), ('A', 11), ('A', 12), ('A', 54), ('A', 55), ('A', 56), 
#  ('B', 72), ('B', 73), ('B', 74), ('B', 75), ('B', 76), ('C', 1), ('C', 2), ('C', 3), ('C', 4), ('C', 5),
#  ('C', 98), ('C', 99), ('C', 100), ('D', 13), ('D', 14), ('D', 21), ('D', 22), ('D', 23), 
#  ('D', 27), ('D', 28), ('D', 29), ('D', 30)]

Или, написанные с помощью циклов, как вы пытались:

out = []
for item1, sublist in zip(lst, lst_of_lst):
    for item2 in sublist:
        out.append((item1, item2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...