OutputLists Combinations
The node that turns a few prompt lists into a whole grid run — no custom KSampler required
- list_a
- list_b
- list_c
- list_d
- unzip_a
- unzip_b
- unzip_c
- unzip_d
- index
- count
If you've ever sweated through ComfyRoll's grid nodes, Efficiency's custom KSamplers, or the "type every prompt manually into a text field" school of XY plotting, this is the node that retires the whole category. CombineOutputLists (shown as "OutputLists Combinations") takes up to four output lists and produces every combination of them - the Cartesian product, in math-speak. Three subjects × three styles × three LoRA strengths = 27 runs, emitted automatically, in one queue. It's the heart of the OutputLists Combiner pack, and it's the reason the author built the rest of it.
The idea: output lists, the 𝌠 symbol
ComfyUI has a native feature most people never notice: a node can declare its outputs as output lists (shown in the UI with the 𝌠 symbol), which tells every node downstream to execute once per value. That's it. No for-loops, no increment counters, no external scripts - the KSampler just runs four times when it receives four prompts. CombineOutputLists is what you use to fan several such lists into one stream of combinations.
Mechanically it's delightfully simple: list_a through list_d are optional inputs of any type (wire them to the value output of a String OutputList, a Number OutputList, a JSON OutputList, whatever). It computes the product and "unzips" it - unzip_a emits the element that came from list_a for each combination, and so on down to unzip_d. Empty lists are handled gracefully: they're replaced with units of None, so [1,2] × [] × ["A","B"] gives you (1, None, "A"), (1, None, "B"), and so forth.
The inputs and outputs that matter
- list_a … list_d - up to four lists, any type, all optional.
- unzip_a … unzip_d - output lists, one per input list. These are what you wire onward.
- index - output list of
0..count, perfect for building row/column labels in a grid or storing in metadata. - count - plain integer, the total number of combinations.
The canonical wiring: two String OutputLists (subjects, colors) → this node → unzip_a and unzip_b into a Formatted String's {a} and {b} → the formatted prompt into CLIP Text Encode. Every combination runs through the sampler, and with an XyzGridPlot downstream you get a labeled grid out the other side. It's the workflow the README's "Combine prompts" example walks through, and once it clicks you'll see combinations everywhere: size variants, sampler×scheduler sweeps, LoRA model × LoRA strength.
Installing
Search "OutputLists Combiner" in ComfyUI Manager and install, or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/geroldmeisinger/ComfyUI-outputlists-combiner
cd ComfyUI-outputlists-combiner
uv pip install -r requirements.txt
Then restart ComfyUI. The pack pulls in pandas and skia-python, so the first install isn't instant, but you only pay that once - every node in the pack shares it.
Where people get burned
The most common confusion (the author answers it on every launch thread): "I only got one image out!" No - each list item is a separate image with batch_size=1. If you connect directly to a Save Image you'll see one file per combination as it runs. To collect them into a single batch for a grid, put a Rebatch Images node between the output list and the grid.
The other trap is combinatorial explosion. Four lists of five is 625 runs. If that's intentional, great; if you meant a quick test, check count before you hit queue. And remember this node only emits combinations - the actual number of values is bounded by your lists, so an empty list quietly produces zero runs until you wire it up.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| list_aopt | * | (optional) ideally connected to a node with `is_output_list=True` indicated by the symbol `𝌠`. | |
| list_bopt | * | (optional) ideally connected to a node with `is_output_list=True` indicated by the symbol `𝌠`. | |
| list_copt | * | (optional) ideally connected to a node with `is_output_list=True` indicated by the symbol `𝌠`. | |
| list_dopt | * | (optional) ideally connected to a node with `is_output_list=True` indicated by the symbol `𝌠`. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| unzip_a | * | Value of the combinations corresponding to `list_a`. use(s) `is_output_list=True` (indicated by the symbol `𝌠`) and will be processed sequentially by corresponding nodes. |
| unzip_b | * | Value of the combinations corresponding to `list_b`. use(s) `is_output_list=True` (indicated by the symbol `𝌠`) and will be processed sequentially by corresponding nodes. |
| unzip_c | * | Value of the combinations corresponding to `list_c`. use(s) `is_output_list=True` (indicated by the symbol `𝌠`) and will be processed sequentially by corresponding nodes. |
| unzip_d | * | Value of the combinations corresponding to `list_d`. use(s) `is_output_list=True` (indicated by the symbol `𝌠`) and will be processed sequentially by corresponding nodes. |
| index | INT | Range of 0..count which can be used as an index. use(s) `is_output_list=True` (indicated by the symbol `𝌠`) and will be processed sequentially by corresponding nodes. |
| count | INT | Total number of combinations. |