ComfyUI Node

XListPull

Unpack a list into separate ports — Data 1, Data 2, Data 3…

By Xz3r0-M·Created 8 months ago·Updated about 6 hours ago· 13
XListPull
  • 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
count_display1
count0

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 count output 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.

Category♾️ Xz3r0/Workflow-Processing

Inputs (3)

NameTypeDefaultDescription
list_inputCOMFY_MATCHTYPE_V3The list to split up. Connect XListCreate's list output (or any other list) here.
count_displayINT11–50How many output ports to show. Connect XListCreate's count here to auto-set it; leave unconnected to use the number field above.
countoptINT00–50Sets how many output ports are active. When connected it overrides the number field above; leave unconnected to set the count manually.

Outputs (50)

NameTypeDescription
Data 1COMFY_MATCHTYPE_V3Data 1 from the list (only active when count >= 1)
Data 2COMFY_MATCHTYPE_V3Data 2 from the list (only active when count >= 2)
Data 3COMFY_MATCHTYPE_V3Data 3 from the list (only active when count >= 3)
Data 4COMFY_MATCHTYPE_V3Data 4 from the list (only active when count >= 4)
Data 5COMFY_MATCHTYPE_V3Data 5 from the list (only active when count >= 5)
Data 6COMFY_MATCHTYPE_V3Data 6 from the list (only active when count >= 6)
Data 7COMFY_MATCHTYPE_V3Data 7 from the list (only active when count >= 7)
Data 8COMFY_MATCHTYPE_V3Data 8 from the list (only active when count >= 8)
Data 9COMFY_MATCHTYPE_V3Data 9 from the list (only active when count >= 9)
Data 10COMFY_MATCHTYPE_V3Data 10 from the list (only active when count >= 10)
Data 11COMFY_MATCHTYPE_V3Data 11 from the list (only active when count >= 11)
Data 12COMFY_MATCHTYPE_V3Data 12 from the list (only active when count >= 12)
Data 13COMFY_MATCHTYPE_V3Data 13 from the list (only active when count >= 13)
Data 14COMFY_MATCHTYPE_V3Data 14 from the list (only active when count >= 14)
Data 15COMFY_MATCHTYPE_V3Data 15 from the list (only active when count >= 15)
Data 16COMFY_MATCHTYPE_V3Data 16 from the list (only active when count >= 16)
Data 17COMFY_MATCHTYPE_V3Data 17 from the list (only active when count >= 17)
Data 18COMFY_MATCHTYPE_V3Data 18 from the list (only active when count >= 18)
Data 19COMFY_MATCHTYPE_V3Data 19 from the list (only active when count >= 19)
Data 20COMFY_MATCHTYPE_V3Data 20 from the list (only active when count >= 20)
Data 21COMFY_MATCHTYPE_V3Data 21 from the list (only active when count >= 21)
Data 22COMFY_MATCHTYPE_V3Data 22 from the list (only active when count >= 22)
Data 23COMFY_MATCHTYPE_V3Data 23 from the list (only active when count >= 23)
Data 24COMFY_MATCHTYPE_V3Data 24 from the list (only active when count >= 24)
Data 25COMFY_MATCHTYPE_V3Data 25 from the list (only active when count >= 25)
Data 26COMFY_MATCHTYPE_V3Data 26 from the list (only active when count >= 26)
Data 27COMFY_MATCHTYPE_V3Data 27 from the list (only active when count >= 27)
Data 28COMFY_MATCHTYPE_V3Data 28 from the list (only active when count >= 28)
Data 29COMFY_MATCHTYPE_V3Data 29 from the list (only active when count >= 29)
Data 30COMFY_MATCHTYPE_V3Data 30 from the list (only active when count >= 30)
Data 31COMFY_MATCHTYPE_V3Data 31 from the list (only active when count >= 31)
Data 32COMFY_MATCHTYPE_V3Data 32 from the list (only active when count >= 32)
Data 33COMFY_MATCHTYPE_V3Data 33 from the list (only active when count >= 33)
Data 34COMFY_MATCHTYPE_V3Data 34 from the list (only active when count >= 34)
Data 35COMFY_MATCHTYPE_V3Data 35 from the list (only active when count >= 35)
Data 36COMFY_MATCHTYPE_V3Data 36 from the list (only active when count >= 36)
Data 37COMFY_MATCHTYPE_V3Data 37 from the list (only active when count >= 37)
Data 38COMFY_MATCHTYPE_V3Data 38 from the list (only active when count >= 38)
Data 39COMFY_MATCHTYPE_V3Data 39 from the list (only active when count >= 39)
Data 40COMFY_MATCHTYPE_V3Data 40 from the list (only active when count >= 40)
Data 41COMFY_MATCHTYPE_V3Data 41 from the list (only active when count >= 41)
Data 42COMFY_MATCHTYPE_V3Data 42 from the list (only active when count >= 42)
Data 43COMFY_MATCHTYPE_V3Data 43 from the list (only active when count >= 43)
Data 44COMFY_MATCHTYPE_V3Data 44 from the list (only active when count >= 44)
Data 45COMFY_MATCHTYPE_V3Data 45 from the list (only active when count >= 45)
Data 46COMFY_MATCHTYPE_V3Data 46 from the list (only active when count >= 46)
Data 47COMFY_MATCHTYPE_V3Data 47 from the list (only active when count >= 47)
Data 48COMFY_MATCHTYPE_V3Data 48 from the list (only active when count >= 48)
Data 49COMFY_MATCHTYPE_V3Data 49 from the list (only active when count >= 49)
Data 50COMFY_MATCHTYPE_V3Data 50 from the list (only active when count >= 50)