Nodes/Kinburg-Nodes/List Output
ComfyUI Node

List Output

The node that turns a collected list into a real ComfyUI list

By Kinburg·Created 3 months ago·Updated 6 days ago· 1
List Output
  • value_0
  • value_1
  • value_2
  • value_3
  • value_4
  • value_5
  • value_6
  • value_7
  • value_8
  • value_9
  • value_10
  • value_11
  • value_12
  • value_13
  • value_14
  • value_15
  • value_16
  • value_17
  • value_18
  • value_19
  • item_0
  • item_1
  • item_2
  • item_3
  • item_4
  • item_5
  • item_6
  • item_7
  • item_8
  • item_9
  • item_10
  • item_11
  • item_12
  • item_13
  • item_14
  • item_15
  • item_16
  • item_17
  • item_18
  • item_19

"List" means two different things in ComfyUI, and the difference is exactly what this node exists for. There's a Python list - a value sitting inside one output that happens to be a list - and there's a ComfyUI list: an output declared with OUTPUT_IS_LIST, which the engine fans out so downstream nodes run once per item. List Output (class name KinburgListEmit) is a leaf node that turns the former into the latter: it takes up to 20 value_* inputs and emits each one as a real per-item ComfyUI list on its item_* outputs.

The primary use is the tail end of a For Each loop. The pack's For Each (Collect) accumulates per-iteration results and hands them back as plain Python lists per slot - deliberately not fanned out, because inside graph expansion ComfyUI flattens list outputs across slots and corrupts the slot count. List Output is the node Collect expands into on its final pass, and there's a 🔗 button on the Collect node that wires one up for you. Standalone, it's also just useful: if some other node hands you a value that is internally a Python list and you need downstream nodes to see each element as its own execution, feed it in here.

Why bother? Because per-item lists are how ComfyUI runs a subgraph once per element, and they're the difference between "one node with a list inside it" and "a graph that processes each item independently." For images specifically, this is how different-sized frames travel separately instead of being forced into one batch - a list of images of mixed resolutions stays a list, where an IMAGE batch would have to pad or crop to stack.

Inputs value_0value_19 are all wildcard * type - any type in, same type out as a list. Outputs item_0item_19 mirror them, each declared is_list: true.

Installing

Ships in Kinburg-Nodes: ComfyUI Manager → search "Kinburg-Nodes", or:

cd ComfyUI/custom_nodes
git clone https://github.com/Kinburg/Kinburg-Nodes
# restart ComfyUI

No dependencies. It's in the flow/loops package and is simplest to think of as part of the For Each story, even though it works standalone.

Gotchas

This node doesn't build a list from nothing - it fans out a value that already is (or contains) a list. If you're trying to gather several separate wires into one list, that's For Each (Collect)'s job, not this node's. And note the outputs are per-item streams, so whatever you wire them into will execute once per item: put this on a branch that feeds a heavy sampler and you've just multiplied the sampler by the list length. That's the intended behavior for a map, and a surprising one if you didn't ask for it.

CategoryKinburg-Nodes/flow/loops

Inputs (20)

NameTypeDefaultDescription
value_0opt*
value_1opt*
value_2opt*
value_3opt*
value_4opt*
value_5opt*
value_6opt*
value_7opt*
value_8opt*
value_9opt*
value_10opt*
value_11opt*
value_12opt*
value_13opt*
value_14opt*
value_15opt*
value_16opt*
value_17opt*
value_18opt*
value_19opt*

Outputs (20)

NameTypeDescription
item_0*
item_1*
item_2*
item_3*
item_4*
item_5*
item_6*
item_7*
item_8*
item_9*
item_10*
item_11*
item_12*
item_13*
item_14*
item_15*
item_16*
item_17*
item_18*
item_19*