Автоматизация функции .append в python 3.7 - PullRequest
1 голос
/ 18 июня 2019

У меня есть список с вложенными списками различной длины в диапазоне от 3 до 105. Я хочу создать на основе этих новых списков, которые содержат комбинацию всех пар в этом исходном списке в следующем формате: из [7,5,6] до [7,5], [7,6], [5,6]

Я использовал приведенный ниже код, но это невозможно с 105 значениями в списке.Есть ли алгоритм, который может автоматизировать этот процесс?

list3 = ([7,5,6], [6,9,7], [7,8,4], [2,4,6,7,9])
list4 = []
for sublist in list3:
    if len(sublist) == 3:
       list4.append([sublist[0], sublist[1])
       list4.append([sublist[0], sublist[2])
       list4.append([sublist[1], sublist[2])

1 Ответ

1 голос
/ 18 июня 2019

Возможно, вы могли бы использовать itertools.combinations() для создания уникальных наборов пар с максимальным диапазоном.

Что-то вроде:

from itertools import combinations
list3 = ([7,5,6], [6,9,7], [7,8,4], [2,4,6,7,9])
list4 = []
for sublist in list3:
    for (i, j) in combinations(range(len(sublist)), 2):
       list4.append([sublist[i], sublist[j]])

Чтобы сделать это болееэффективнее, я бы порекомендовал использовать понимание списка:

list4 = [[sublist[i], sublist[j]] for sublist in list3 for (i, j) in combinations(range(len(sublist)), 2)]

Больше о понимании списка по сравнению с добавлением к списку с использованием циклов for: Почему понимание списка намного быстрее, чем добавление в список?


Как отметил @chepner в своем комментарии ниже, combinations принимает любую итерацию, так что вы можете просто использовать это как входные данные для combinations.Нам также не нужно добавлять отдельные элементы.Мы можем сгенерировать нужные нам комбинации, которые будут генерировать список, и мы можем просто объединить все вместе:

list4 = [t for sublist in list3 for t in combinations(sublist, 2)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...