Создайте все отдельные значения, пары, тройки и т. Д., Учитывая диапазон чисел - PullRequest
0 голосов
/ 04 апреля 2019

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

`N = 3` (for example)

Исходя из этого, мне нужно создать список списков, содержащий все одноэлементные списки, пары, тройки (и т. Д., Но для этого случая тройки - это максимум).

[ [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3] ]

Код у меня сейчас:

from itertools import combinations

N = 3
comb_lst = []

for idx in range(1, N+1):
    comb = combinations([1, 2, 3], idx)
    for i in comb:
        comb_lst += [list(i)]

print(comb_lst)

Проблема в том, что я не думаю, что это масштабируется до тысяч пользователей, так есть ли более быстрый метод?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Подход правильный и эффективный. Небольшое улучшение:

import itertools

N = 3
numbers = list(range(N+1))

result = []
for i in range(1, N+1):
    result.extend(itertools.combinations(numbers, i))

Результаты:

result
Out[2]: [(1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

И если вы хотите, чтобы пары / тройки с одним и тем же элементом повторялись, используйте itertools.combinations_with_replacement().

0 голосов
/ 04 апреля 2019

Минимальная сложность - число comb_lst. Количество это 2 ** N. Вы можете включать или не включать каждый элемент (2 варианта для одного элемента). Так что для N около 1000 это не масштаб

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