Výborná otázka – pojďme si vysvětlit rozdíl mezi append()
a extend()
a proč je v tomto konkrétním případě správné použít extend()
.
🔍 append()
vs extend()
:
Funkce | Co dělá | Příklad |
---|---|---|
append(x) |
Přidá celý objekt x jako jeden prvek |
[1, 2].append([3, 4]) → [1, 2, [3, 4]] |
extend(x) |
Přidá všechny prvky ze sekvence x jednotlivě |
[1, 2].extend([3, 4]) → [1, 2, 3, 4] |
📘 Co přesně děláš ve funkci?
Ve funkci získáváš children
ze node
:
children = node.get("children", [])
Hodnota children
je seznam ID potomků daného uzlu (např. ["abc123", "def456"]
). Tím pádem:
❌ Pokud bys použil:
root_chat.append(children)
Výsledek bude:
root_chat = [["abc123", "def456"]] # špatně – seznam v seznamu
✅ Ale pokud použiješ:
root_chat.extend(children)
Výsledek bude:
root_chat = ["abc123", "def456"] # správně – seznam ID
🔧 Shrnutí:
Použij extend()
pokud chceš slít obsah seznamu do jiného seznamu, nikoli vnořit seznam jako prvek. Ve tvém případě pracuješ s ID uzlů a očekáváš plochý seznam všech potomků určitého typu (root_chat
, user_chat
, assistant_chat
).
Můj příklad pro json:
for idx, session in enumerate(data, 1):
title = session.get("title", "<bez názvu>")
ct = session.get("create_time")
if isinstance(ct, (int, float)):
dt = datetime.fromtimestamp(ct)
ct_str = dt.strftime("%Y-%m-%d %H:%M:%S")
else:
ct_str = str(ct)
# root
# └── node A (system message)
# └── node B (user message) <--- tu chceš najít
# └── node C (assistant)
mapping = session.get("mapping", {})
root = next((nid for nid,node in mapping.items() if node.get("parent") is None), None)
children = mapping.get(root, {}).get("children", [])
root_first_id = None
user = None
root_chat = []
user_chat = []
assistant_chat = []
for nid, node in mapping.items():
if root is None and node.get("parent") is None:
root_first_id = nid
role = node.get("author").get("role")
children = node.get("children", []) # children obsahuje seznamy ideček
if role == "system":
root_chat.extend(children) else:
if role == "user":
user_chat.extend(children) else:
if role == "assistant":
assistant_chat.extend(children)
Žádné komentáře:
Okomentovat