Как сгенерировать список перестановок списков в python

#python #list #loops

#python #Список #циклы

Вопрос:

У меня есть следующие данные в списке списков. Это топливный пучок (с половинной симметрией) для ядерного реактора, и каждое число представляет собой топливный штырь (с разным обогащением). Чем больше число, тем больше топлива. Я пытаюсь сгенерировать большое количество входных файлов для запуска (у меня уже есть функция, которая введет мой массив в мой входной файл и запустит его). Это всего лишь пример того, как будет выглядеть один массив

 20 
30 60
50 80 80 
60 80 80 80 
60 81 80 80 80 
60 80 80 00 00 80 
60 80 80 00 00 80 80 
50 80 80 80 80 80 80 80 
40 70 80 81 80 80 80 80 80
20 40 60 70 80 80 70 71 50 30
  

Поэтому я буду использовать правила для создания списков. Подобно тому, как контакты по краям должны быть с низким обогащением, контакты, которые не делятся на 10, не могут находиться на ребре или грани, смежной друг с другом, или грани, смежной с 00. Поскольку каждое место имеет 90 вариантов, мне нужно ограничить общие возможности. Вот почему я хотел сгенерировать список параметров для каждого местоположения в массиве, а затем создать все возможные массивы. Я понимаю, как реализовать все мои правила, я просто запутался в построении всех возможных комбинаций массивов.

Как бы мне сгенерировать все возможные комбинации для моего массива? Или, если есть лучший способ выполнить то, что я пытаюсь сделать. Мой опыт работы с Python составляет всего около двух недель.

Комментарии:

1. Я не понимаю, каким должен быть ваш треугольник чисел. И откуда взялись [10, 20, 30] ? Я не вижу в этом ни одной строки в вашем списке.

2. Можете ли вы привести более наглядный пример того, чего вы пытаетесь достичь? Ваша формулировка неясна.

3. Я думаю, что способ, которым мы все сейчас представляем, — это list[0][0] доступ 20 . 20 Соответствует ли pin [10, 20, 30] -код?

4. Поэтому я буду использовать правила для создания списков. Подобно тому, как контакты по краям должны быть с низким обогащением, контакты, которые не делятся на 10, не могут находиться на ребре или грани, смежной друг с другом, или грани, смежной с 00. Поскольку каждое место имеет 90 вариантов, мне нужно ограничить общие возможности. Вот почему я хотел сгенерировать список параметров для каждого местоположения в массиве

5. Ваша формулировка является ядерной

Ответ №1:

Если я вас понимаю, это относительно просто с помощью инструментов в itertools модуле. Что-то вроде

 from itertools import product, chain

def choose_from_2d_lol(lol):
    flattened_options = list(chain.from_iterable(lol))
    for p in product(*flattened_options):
        p_iter = iter(p)
        new_list = [[next(p_iter) for elem in row] for row in lol]
        yield new_list
  

будет перебирать все возможности:

 >>> xx = [[[10,20,30]],[[44], [55,66]]]
>>> for chosen in choose_from_2d_lol(xx):
...     print(chosen)
...     
[[10], [44, 55]]
[[10], [44, 66]]
[[20], [44, 55]]
[[20], [44, 66]]
[[30], [44, 55]]
[[30], [44, 66]]
  

Обратите внимание, однако, что рассмотрение всех возможностей таким образом вполне может быть совершенно неосуществимым, поскольку количество возможностей будет расти очень быстро.

Комментарии:

1. Извините, не могли бы вы объяснить, что именно вы здесь делаете flattened_options = list(chain.from_iterable(lol))

2. @Greg: добавьте print(flattened_options) после этой строки, чтобы увидеть. По сути, он берет список списков lol и превращает его в плоский список, так что здесь он превращается xx в [[10, 20, 30], [44], [55, 66]] .

3. Есть ли from_iterable функция или это просто общее имя, которое вы использовали? Я вижу, что это делает то, что я хочу, я просто пытаюсь понять это, поэтому это не просто черный ящик, который делает то, что я хочу.

4. Если вы нажмете на ссылку на itertools документацию, вы можете прокрутить вниз и нажать на chain.from_iterable .

5. Нет, вы можете думать chain.from_iterable как о функции. chain.from_iterable(lol) создает itertools.chain экземпляр, который мы затем вызываем list для перебора и создания списка.