Многоуровневый вложенный список
Я пытаюсь реализовать настраиваемые автоматы, где таблица перехода выглядит следующим образом:
Таблица является динамической, то есть заголовок столбца, имя строки и данные в каждой ячейке могут быть определены во время выполнения. Имя столбца и имя строки также необходимы.
Я пробовал этот код
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)
Честно говоря, я не понимаю, что представляет таблица, поэтому не могу дать вам конкретного совета, но думаю, что это, по крайней мере, будет более четкой структурой данных.