#python #json #database #graph
#python #json #База данных #График
Вопрос:
Допустим, у меня есть следующие данные, и я хочу найти все под названием «иммунодефициты».
startNode - relationship - endNode
immunodeficiencies - includes - B cell disorders
B cell disorders - includes - Bruton Agammaglobulinemia
B cell disorders - includes - Hyper-IgM syndrome
immunodeficiencies - includes - T cell disorders
T cell disorders - includes - DiGeorge Syndrome
immunodeficiencies - includes - combined B and T cell disorders
combined B and T cell disorders - includes - Ataxia-Telangiectasia
Как бы я это сделал? Данные находятся в формате JSON, так что это так {"startNode": "immunodeficiencies", "relationship": "includes", "endNode": "B cell disorders"}
Только для одной не вложенной категории это было легко. Я сделал следующее:
for x in range(len(peds_diseaseR))
if peds_diseaseR[x]["startNode"] == "immunodeficiencies" amp;amp; peds_diseaseR[x]["relationship"] == "includes":
List.append(x)
Для вложенной болезни я действительно потерян. Я чувствую, что, возможно, мне нужна рекурсивная функция, но я понятия не имею. Я собирался ввести код, который я написал, но я чувствую, что это было бы более запутанным, чем что-либо, и это не работает.
РЕДАКТИРОВАТЬ: только что добавил это, но это не работает.
var endNodes = []
func findEndNodes(start):
for x in range(len(peds_diseaseR)):
if peds_diseaseR[x]["startNode"] == start amp;amp; peds_diseaseR[x]["relationship"] == "includes":
endNodes.append(peds_diseaseR[x]["endNode"])
if endNodes != []:
for disease in endNodes:
findEndNodes(disease)
print(endNodes)
return endNodes
Комментарии:
1. Каковы различные отношения? Существуют ли другие отношения, кроме
includes
существующих?2. О, и func не является ключевым словом python. Ключевое слово, которое вы ищете здесь, это
def
3. О, извините. На самом деле я использую gdscript, который в основном является python с некоторыми незначительными отличиями.
func
будучи одним из них4. И да, существуют другие отношения, отличные от includes!
hx
(имеется в виду история),pe
(имеется в виду физический осмотр) иtx
(имеется в виду лечение)
Ответ №1:
Вы очень близки. Всего лишь небольшая реорганизация, и вы найдете решение:
peds_diseaseR = []
def findEndNodes(start):
# declared inside the function, because you need a fresh one for every recursion
childnodes = []
for relationship in peds_diseaseR:
if relationship["startNode"] == start amp;amp; relationship["relationship"] == "includes":
disease = relationship["endNode"]
child_nodes.append(disease)
# If you process it now, you do not need to check if you have values in your list.
# Thus, less code, but more importantly, less states your code can be in.
# It is very easy to get lost trying to make a mental map when doing recursion.
# Keep it as simple as possible!
recursion_nodes = findEndNodes(disease)
child_nodes.extend(recursion_nodes)
print(child_nodes)
return child_nodes
Как вы можете видеть, я заменил только func
на def
, и я удалил var
ключевое слово. Этого не существует в python. Вы просто присваиваете значение. Существует небольшая, но тонкая разница между append и extend . extend
append
все значения будут в списке.
Комментарии:
1. ВАУ, большое вам спасибо за это!! Особенно для комментариев. Очень полезно!