if len(cur_node.members) <= 1:
print(cur_node.members)
member = str(cur_node.members[0])
print(member)
return member
Вся программа здесь: gitlab: dicotomous_key 1 : https://gitlab.com/vanzippee/dicotomous_key
Программа печатает «cur_node.member» и «member» правильно (только что добавлено для проверки), но возвращаемое значение при печати равно «None».
Я не решался поставить весь модуль здесь из-за длины, но здесь это так. Я изменил оператор с исходного (в git), который называл базу данных, на оператор, открывающий файл json.
Json файл для библиотеки:
Весь модуль:
import json
class node:
def __init__(self, members=None, criterion_index=0):
print("new_node:", members)
self.members = members
self.criterion_index = criterion_index
self.left_child = None
self.right_child = None
self.y = []
self.n = []
class tree:
def __init__(self, criteria, doc):
self.root = None
self.criteria = criteria
self.doc = doc
def insert(self, members):
if self.root is None:
self.root = node(members)
self.insert(members)
else:
separated = self._insert(self.root, members)
print("separated =", separated)
return separated
def _insert(self, cur_node, members):
if len(cur_node.members) <= 1:
print(cur_node.members)
member = str(cur_node.members[0])
print(member)
return member
elif cur_node.criterion_index < len(self.criteria):
y = []
n = []
for member in members:
if member in self.doc[self.criteria[cur_node.criterion_index]]:
y.append(member)
else:
n.append(member)
cur_node.criterion_index += 1
if len(y) > 0 and len(n) > 0:
if cur_node.left_child is not None:
cur_node = cur_node.left_child
self._insert(cur_node, y)
else:
cur_node.left_child = node(y,
cur_node.criterion_index)
self._insert(cur_node.left_child,
cur_node.left_child.members)
elif (len(y) == 0 and len(n) > 0 and cur_node.left_child is
not None):
if cur_node.right_child is not None:
cur_node = cur_node.right_child
self._insert(cur_node, n)
else:
cur_node.rigth_child = node(n,
cur_node.criterion_index)
self._insert(cur_node.right_child,
cur_node.right_child.members)
else:
self._insert(cur_node, cur_node.members)
def print_tree(self):
if self.root is not None:
self._print_tree(self.root)
def _print_tree(self, cur_node):
if cur_node is not None:
self._print_tree(cur_node.left_child)
if len(cur_node.members) == 1:
print(cur_node.members, "separated.")
self._print_tree(cur_node.right_child)
def make_dicotomous_key(user, category):
with open('doc.json') as json_file:
doc = json.load(json_file)
members = doc["members"]
criteria = doc["criteria"]
dicotomous_key = tree(criteria, doc)
while len(members) > 0:
separated = dicotomous_key.insert(members)
if separated is not None:
print("returned", separated)
members.remove(separated)
dicotomous_key.print_tree()
if __name__ == "__main__":
user = "default"
category = "shark_faimilies"
make_dicotomous_key(user, category)