Предполагая (из вывода вашего кода и того факта, что вы намеренно добавили несколько копий 0, 1 и 2), что вы делаете «перестановки с заменой» или в основном декартовский продукт с требованием 3 Nones, я 'd сделайте что-то вроде:
def tien_gen(size, values, number_of_nones):
to_fill = size - number_of_nones
for locs in itertools.combinations(range(size), to_fill):
for fill_values in itertools.product(values, repeat=to_fill):
out = [None] * size
for loc, fill_value in zip(locs, fill_values):
out[loc] = fill_value
yield tuple(out)
, которое соответствует вашему выходу:
In [137]: result = list(tien_gen(5, [0,1,2], 3))
In [138]: len(result)
Out[138]: 90
In [139]: result
Out[139]:
[(0, 0, None, None, None),
(0, 1, None, None, None),
(0, 2, None, None, None),
(1, 0, None, None, None),
[...]
(None, 0, None, 1, None),
(None, 0, None, 2, None),
(None, 1, None, 0, None),
[...]
(None, 2, None, 1, None),
(None, 2, None, 2, None),
(None, 0, None, None, 0),
(None, 0, None, None, 1),
[...]
(None, None, None, 1, 2),
(None, None, None, 2, 0),
(None, None, None, 2, 1),
(None, None, None, 2, 2)]
In [140]: orig = [state for state in list(set(it.permutations((None, None, None, 0, 0, 1, 1, 2, 2), 5))) if state.count(None)==3]
In [141]: len(result) == len(orig) and set(result) == set(orig)
Out[141]: True
Для небольших размеров преимущества ограничены, но для более крупных, таким образом, вы избегаете создания каких-либо кортеж, который вы не используете, и поскольку это генератор, вам не нужно их материализовывать, если вы этого не хотите.
изменил службу:
public getCatalog() {
console.log(this.catalog);
return this.catalog;
}
loadCatalog() {
this.fetchCatalog().subscribe(catalog => this.catalog.next(catalog));
}
public fetchCatalog(): Observable<Catalog[]> {
return this.http.get<Catalog>(ZUORA_URL + '/v1/catalog/products?page=1&pageSize=10', { headers })
.pipe(
expand(catalog => {
if (!catalog.nextPage) {
return EMPTY;
}
return this.http.get<Catalog>(ZUORA_URL + catalog.nextPage, { headers });
}),
map(catalog => catalog.products),
reduce((accData, data) => accData.concat(data), []),
);
}
добавил фабрику в app.module.ts -> Данные загружаются один раз при сборке приложения -> данные не нужно перезагружать каждый раз, когда пользователь изменяет представление
export function catalogProviderFactory(zuoraService: ZuoraService) {
return () => zuoraService.loadCatalog();
}
Компонент OnInit для построения таблицы:
ngOnInit() {
this.zuoraService.catalog$.subscribe(catalog => {
this.dataSource = new MatTableDataSource(catalog);
this.dataSource.paginator = this.paginator;
this.dataSource.sort = this.sort;
});