Slice a list into sub-lists: slice
The slice filter divides a list into a specified number of sub-lists of approximately equal size. If the items do not divide evenly, the earlier sub-lists will have one more item than the later ones. You can optionally provide a fill value to pad the shorter sub-lists.
This is useful when you need to distribute items evenly across a fixed number of groups. For example, you might want to split a list of entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more] into columns for display, distribute tasks across multiple workers, or divide a collection into a set number of pages. Note that slice differs from batch: batch creates groups of a fixed size, while slice creates a fixed number of groups.
Usage
Here’s how to use this template function. Copy any example and adjust it to your setup.
{{ [1, 2, 3, 4, 5] | slice(3) | list }}
[[1, 2], [3, 4], [5]]
Function signature
The signature is a technical summary of this template function. It shows the name of the function, the values (called parameters) it accepts, and what type of data each parameter expects (for example, a piece of text or a number).
Function parameters that have a = with a value after them are optional. If you leave them out, the default value shown is used automatically. Function parameters without a default are required.
slice(
value: list,
slices: int,
fill_with: Any = None,
) -> list[list]
Function parameters
The following parameters can be provided to this filter.
Padding with fill_with
Use the fill_with parameter so all sub-lists have the same number of items.
{{ [1, 2, 3, 4, 5] | slice(3, "-") | list }}
[[1, 2], [3, 4], [5, "-"]]
Good to know
- You specify the number of sub-lists, not the size of each one. Use
batchwhen you want a fixed size per group. - Returns a generator, so add
| listbefore iterating twice. - Earlier sub-lists get the extra items when the count does not divide evenly.
Try it yourself
Ready to test this? Open Developer tools > Template, paste the example into the Template editor, and watch the result update on the right. Edit the values to see how the function adapts to your own entitiesAn entity represents a sensor, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a device or a service. [Learn more].
More examples
Real scenarios where this function comes up in automations and templates. Copy any example and adapt it to your setup.
Distribute entities across columns
Split a list of entities into three columns for a balanced display.
{% set lights = ["light.kitchen", "light.bedroom", "light.hall",
"light.porch", "light.garage", "light.office",
"light.bathroom"] %}
{% for column in lights | slice(3) %}
Column {{ loop.index }}: {{ column | join(", ") }}
{% endfor %}
Column 1: light.kitchen, light.bedroom, light.hall
Column 2: light.porch, light.garage, light.office
Column 3: light.bathroom
Split items into two halves
Divide a list into two roughly equal parts.
{% set items = range(8) | list %}
{% set halves = items | slice(2) | list %}
First half: {{ halves[0] | join(", ") }}
Second half: {{ halves[1] | join(", ") }}
First half: 0, 1, 2, 3
Second half: 4, 5, 6, 7
Still stuck?
The Home Assistant community is quick to help: join Discord for real-time chat, post on the community forum with your template and expected result, or share on our subreddit /r/homeassistant.
AI assistants like ChatGPT or Claude can also explain or fix templates when you describe what you want in plain language.
Related template functions
These functions work well alongside this one:
-
Split list into batches: batch - Splits a list into smaller batches of a specified size.
-
Group items by attribute: groupby - Groups a list of items by a common attribute, producing a list of (grouper, list) pairs.
-
Flatten nested lists: flatten - Flattens nested lists into a single flat list.