XListPull
Unpack a list into separate ports — Data 1, Data 2, Data 3…
- list_input
- Data 1
- Data 2
- Data 3
- Data 4
- Data 5
- Data 6
- Data 7
- Data 8
- Data 9
- Data 10
- Data 11
- Data 12
- Data 13
- Data 14
- Data 15
- Data 16
- Data 17
- Data 18
- Data 19
- Data 20
- Data 21
- Data 22
- Data 23
- Data 24
- Data 25
- Data 26
- Data 27
- Data 28
- Data 29
- Data 30
- Data 31
- Data 32
- Data 33
- Data 34
- Data 35
- Data 36
- Data 37
- Data 38
- Data 39
- Data 40
- Data 41
- Data 42
- Data 43
- Data 44
- Data 45
- Data 46
- Data 47
- Data 48
- Data 49
- Data 50
This is the "undo" half of the pack's list story. XListCreate (or any list-producing node) gives you one wire carrying many values; XListPull takes that wire and splits it back into individual output ports, Data 1, Data 2, and so on, up to 50 of them. Where it gets smart is that the number of visible ports is driven by a number - so your graph can expand and contract its own wiring based on how much data is actually there.
How it works
Two ways to control the port count:
- count_display - the manual number field on the node, from 1 to 50.
- count - a connectable input port. Hook XListCreate's
countoutput here and the node sizes itself to match the list automatically, which is the trick that makes this feel less like a static node and more like a living part of the graph.
The list_input accepts any list wire - the pack's XListCreate output is the obvious one, but any list-carrying wire works because the element type matches through to the output ports. Each item lands on its own port: Data 1 gets the first element, Data 2 the second, and so on. Ports beyond the count are just inactive, and anything the list doesn't fill is None rather than an error.
Why you'd reach for it
The classic pattern is a mixed batch. You pack several images (or prompts, or any data) into one list, run them through a batch-capable node as a group - which is often dramatically faster than looping - and then split them back out so each result lands on its own named wire and feeds a distinct downstream path. It's also just handy for debugging: a list is opaque on one wire, but pulled out into Data 1 / Data 2 you can finally see what you're working with.
Installing it
XListPull ships in ComfyUI-Xz3r0-Nodes (by Xz3r0-M) under ♾️ Xz3r0/Workflow-Processing. ComfyUI Manager: search ComfyUI-Xz3r0-Nodes and install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Xz3r0-M/ComfyUI-Xz3r0-Nodes.git
cd ComfyUI-Xz3r0-Nodes
pip install -r requirements.txt
Restart ComfyUI after. No models, no heavy dependencies - pure graph plumbing.
Gotchas
Remember that when count is connected it overrides the manual field, so if you're setting count_display by hand and it keeps ignoring you, check whether something is plugged into count. And the outputs are padded with None past the list's real length - a downstream node that doesn't tolerate None will complain about the tail, so don't assume Data 50 exists just because the port is there. For anything that needs position tracking rather than simple unpacking, pair this with XListRestore instead.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| list_input | COMFY_MATCHTYPE_V3 | The list to split up. Connect XListCreate's list output (or any other list) here. | |
| count_display | INT | 11–50 | How many output ports to show. Connect XListCreate's count here to auto-set it; leave unconnected to use the number field above. |
| countopt | INT | 00–50 | Sets how many output ports are active. When connected it overrides the number field above; leave unconnected to set the count manually. |
Outputs (50)
| Name | Type | Description |
|---|---|---|
| Data 1 | COMFY_MATCHTYPE_V3 | Data 1 from the list (only active when count >= 1) |
| Data 2 | COMFY_MATCHTYPE_V3 | Data 2 from the list (only active when count >= 2) |
| Data 3 | COMFY_MATCHTYPE_V3 | Data 3 from the list (only active when count >= 3) |
| Data 4 | COMFY_MATCHTYPE_V3 | Data 4 from the list (only active when count >= 4) |
| Data 5 | COMFY_MATCHTYPE_V3 | Data 5 from the list (only active when count >= 5) |
| Data 6 | COMFY_MATCHTYPE_V3 | Data 6 from the list (only active when count >= 6) |
| Data 7 | COMFY_MATCHTYPE_V3 | Data 7 from the list (only active when count >= 7) |
| Data 8 | COMFY_MATCHTYPE_V3 | Data 8 from the list (only active when count >= 8) |
| Data 9 | COMFY_MATCHTYPE_V3 | Data 9 from the list (only active when count >= 9) |
| Data 10 | COMFY_MATCHTYPE_V3 | Data 10 from the list (only active when count >= 10) |
| Data 11 | COMFY_MATCHTYPE_V3 | Data 11 from the list (only active when count >= 11) |
| Data 12 | COMFY_MATCHTYPE_V3 | Data 12 from the list (only active when count >= 12) |
| Data 13 | COMFY_MATCHTYPE_V3 | Data 13 from the list (only active when count >= 13) |
| Data 14 | COMFY_MATCHTYPE_V3 | Data 14 from the list (only active when count >= 14) |
| Data 15 | COMFY_MATCHTYPE_V3 | Data 15 from the list (only active when count >= 15) |
| Data 16 | COMFY_MATCHTYPE_V3 | Data 16 from the list (only active when count >= 16) |
| Data 17 | COMFY_MATCHTYPE_V3 | Data 17 from the list (only active when count >= 17) |
| Data 18 | COMFY_MATCHTYPE_V3 | Data 18 from the list (only active when count >= 18) |
| Data 19 | COMFY_MATCHTYPE_V3 | Data 19 from the list (only active when count >= 19) |
| Data 20 | COMFY_MATCHTYPE_V3 | Data 20 from the list (only active when count >= 20) |
| Data 21 | COMFY_MATCHTYPE_V3 | Data 21 from the list (only active when count >= 21) |
| Data 22 | COMFY_MATCHTYPE_V3 | Data 22 from the list (only active when count >= 22) |
| Data 23 | COMFY_MATCHTYPE_V3 | Data 23 from the list (only active when count >= 23) |
| Data 24 | COMFY_MATCHTYPE_V3 | Data 24 from the list (only active when count >= 24) |
| Data 25 | COMFY_MATCHTYPE_V3 | Data 25 from the list (only active when count >= 25) |
| Data 26 | COMFY_MATCHTYPE_V3 | Data 26 from the list (only active when count >= 26) |
| Data 27 | COMFY_MATCHTYPE_V3 | Data 27 from the list (only active when count >= 27) |
| Data 28 | COMFY_MATCHTYPE_V3 | Data 28 from the list (only active when count >= 28) |
| Data 29 | COMFY_MATCHTYPE_V3 | Data 29 from the list (only active when count >= 29) |
| Data 30 | COMFY_MATCHTYPE_V3 | Data 30 from the list (only active when count >= 30) |
| Data 31 | COMFY_MATCHTYPE_V3 | Data 31 from the list (only active when count >= 31) |
| Data 32 | COMFY_MATCHTYPE_V3 | Data 32 from the list (only active when count >= 32) |
| Data 33 | COMFY_MATCHTYPE_V3 | Data 33 from the list (only active when count >= 33) |
| Data 34 | COMFY_MATCHTYPE_V3 | Data 34 from the list (only active when count >= 34) |
| Data 35 | COMFY_MATCHTYPE_V3 | Data 35 from the list (only active when count >= 35) |
| Data 36 | COMFY_MATCHTYPE_V3 | Data 36 from the list (only active when count >= 36) |
| Data 37 | COMFY_MATCHTYPE_V3 | Data 37 from the list (only active when count >= 37) |
| Data 38 | COMFY_MATCHTYPE_V3 | Data 38 from the list (only active when count >= 38) |
| Data 39 | COMFY_MATCHTYPE_V3 | Data 39 from the list (only active when count >= 39) |
| Data 40 | COMFY_MATCHTYPE_V3 | Data 40 from the list (only active when count >= 40) |
| Data 41 | COMFY_MATCHTYPE_V3 | Data 41 from the list (only active when count >= 41) |
| Data 42 | COMFY_MATCHTYPE_V3 | Data 42 from the list (only active when count >= 42) |
| Data 43 | COMFY_MATCHTYPE_V3 | Data 43 from the list (only active when count >= 43) |
| Data 44 | COMFY_MATCHTYPE_V3 | Data 44 from the list (only active when count >= 44) |
| Data 45 | COMFY_MATCHTYPE_V3 | Data 45 from the list (only active when count >= 45) |
| Data 46 | COMFY_MATCHTYPE_V3 | Data 46 from the list (only active when count >= 46) |
| Data 47 | COMFY_MATCHTYPE_V3 | Data 47 from the list (only active when count >= 47) |
| Data 48 | COMFY_MATCHTYPE_V3 | Data 48 from the list (only active when count >= 48) |
| Data 49 | COMFY_MATCHTYPE_V3 | Data 49 from the list (only active when count >= 49) |
| Data 50 | COMFY_MATCHTYPE_V3 | Data 50 from the list (only active when count >= 50) |