Interactive list with action buttons

I couldn’t find a nice implementation for a grid where for each row there are buttons for actions (like edit or delete).
I decided to use markup and render a grid like rows by myself. The main issue with deleting is that indexes change when deleting a list item.
Attaching here a snippet, in hope it will have someone or a better solution will be suggested:

import streamlit as st

if 'my_list' not in st.session_state:
    st.session_state.my_list = [{"name": "a", "val": "b"}, {
        "name": "c", "val": "d"}, {"name": "e", "val": "f"}, {"name": "g", "val": "h"}, {"name": "i", "val": "j"}]

for index, item in enumerate(st.session_state.my_list):
    emp = st.empty()
    col1, col2, col3 = emp.columns([9, 1, 1])
    if col2.button("Del", key=f"but{index}"):
        del st.session_state.my_list[index]
    if col3.button("Edit", key=f"ed{index}"):
        # not implemented - just for example
        pass
    if len(st.session_state.my_list) > index:
        col1.markdown(f'My row item **{item}**. Item index {index}', unsafe_allow_html=True)
    else:
        emp.empty()

How it looks: