Многоуровневый вложенный список

Я пытаюсь реализовать настраиваемые автоматы, где таблица перехода выглядит следующим образом:

Таблица является динамической, то есть заголовок столбца, имя строки и данные в каждой ячейке могут быть определены во время выполнения. Имя столбца и имя строки также необходимы.

Я пробовал этот код

table = []
table.append(["A",[0,["B",2],["C1",2]],[1,["C1",1]]])
table.append(["B",[0,["C",1]],[1,["C2",1]]])
table.append(["C",[0,["C1",1]],[1,["C2",1]]])

но я не могу получить доступ к отдельному элементу в ячейке, т.е. B или 2 из B:2 и т. д. Затем я попытался

row = ["A","B","C","C1","C2"]
col = [0,1]
table = [] 
table.append([[["B",2],["C1",2]],["C1",1]])
table.append([["C",1],["C2",1]])
table.append([["C1",1],["C2",1]])

print(table[0][0][0][0])

Теперь я могу получить доступ к отдельному элементу (B в вышеупомянутом случае), но я потерян с четырьмя индексами. Особенно, когда я не знаю глубину списка заранее. Нужно получить помощь, чтобы сделать это каким-то простым способом. Будучи новичком, я буду признателен за некоторые объяснения к питону кода.

Обновление: это недетерминированные конечные автоматы. Я попробовал пакет автоматов, но они не решают мою проблему. Следуя решению Tadhg-Mcdonald-Jensen, он дает правильный вывод для первой строки (A) в таблице, но сообщение об ошибке для второй строки (B). Вот код

table = {}
table["A"] = {0: {"B":2, "C1":2}, 1: {"C1":1}}
table["B"] = {0: {"C":1},         1: {"C2",1}}
table["C"] = {0: {"C1":1},        1: {"C2",1}}

for key,value in table["A"][0].items():  \\ok treated as dictionary (1)
    print(key, value, sep="\t")        
for key,value in table["A"][1].items():  \\ok treated as dictionary (2)
    print(key, value, sep="\t")          
for key,value in table["B"][0].items():  \\ok treated as dictionary (3)
    print(key, value, sep="\t")          
for key,value in table["B"][1].items():  \\wrong: why treated as set? Although same as (2)
    print(key, value, sep="\t")          \\Error message: AttributeError: 'set' object has no attribute 'items' 

Выход

B   2
C1  2 
C1  1
C   1
Traceback (most recent call last):
  File "C:/Users/Abrar/Google Drive/Tourism Project/Python Projects/nestedLists.py", line 17, in <module>
for key,value in table["B"][1].items():
AttributeError: 'set' object has no attribute 'items'

1 ответ

Решение

Pandas отлично разбирается в таблицах, но вы также можете перейти к словарям, так или иначе, список - это не та структура данных, которую вы хотите.

table = {}
table["A"] = {0: {"B":2, "C1":2}, 1: {"C1":1}}
table["B"] = {0: {"C":1},         1: {"C2":1}}
table["C"] = {0: {"C1":1},        1: {"C2":1}}

затем table["A"][0] даст вам первый элемент, каждый элемент будет иметь одну или несколько записей, если вы хотите перебрать записи, которые вы можете сделать for key,value in table["A"][0].items()

Или для перебора всей таблицы вы можете использовать 3 вложенных цикла:

#do_stuff = print
for row, line in table.items():
    #each row in the table, row will go through ("A", "B", "C")
    for column, cell in line.items():
        #each cell in the row, column will go through (0, 1)
        for label, value in cell.items(): 
            #each entry in cell, most only have one entry except table["A"][0]
            do_stuff(row, column, label, value)

Честно говоря, я не понимаю, что представляет таблица, поэтому не могу дать вам конкретного совета, но думаю, что это, по крайней мере, будет более четкой структурой данных.

Другие вопросы по тегам