#python #python-3.x
Вопрос:
допустим , у нас есть список, состоящий из целого числа от 0 до другого числа, большего 0 :
list = [0,1,2,3...and so on]
Я хотел бы получить набор или даже список, содержащий список для всех пар возможных комбинаций между элементами начального списка. как это:
new_list = [[0,1],[0,2],[0,3],[1,0],[1,2],[1,3],[2,0],[2,1],[2,3],[3,0],[3,1],[3,2]]
Как вы можете видеть, пары [0,0],[1,1],[2,2],[3,3] не должно быть включено.
Я пробовал несколько вещей, но в итоге ничего не вышло . Знаете ли вы эффективный способ сделать это?
Ответ №1:
Использование itertools.combinations
и их отмена:
from itertools import combinations combos = list(combinations(lst, 2)) new_list = [*combos, *(c[::-1] for c in combos)]
Или вручную:
def pairings(pool): for i, m in enumerate(pool): for n in pool[i 1:]: yield (m, n) # yield (n, m) # saves second loop if order does not matter for i, m in enumerate(pool): for n in pool[i 1:]: yield (n, m) new_list = list(pairings(lst))
Комментарии:
1. Можно ли это сделать без импорта? может быть, с пониманием списка?
Ответ №2:
Вы можете использовать простое понимание списка:
[[a, b] for a in lst for b in list if a != b]
Ответ №3:
Как насчет простого понимания вложенного цикла или генератора?
def comb_not_eq_loop(seq, container=list): return container(x, y) for x in seq for y in seq if x != y) comb_not_eq_loop(list(range(3)) # [(0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)]
def comb_not_eq_gen(seq): for x in seq: for y in seq: if x != y: yield (x, y) list(comb_not_eq_gen(list(range(3))) # [(0, 1), (0, 2), (1, 2), (1, 0), (2, 0), (2, 1)]