Próbuję zbudować drzewo ogólne.
Czy istnieją jakieś wbudowane struktury danych w Pythonie, aby je zaimplementować?
python
data-structures
tree
Visnu
źródło
źródło
Odpowiedzi:
kiedykolwiek
Polecam https://pypi.python.org/pypi/anytree (jestem autorem)
Przykład
cechy
Anyree ma również potężne API z:
źródło
anytree
jest to prawdopodobnie świetna biblioteka, jest to pytanie python, a nie pytanie Node.js.Python nie ma tak szerokiego zakresu „wbudowanych” struktur danych, jak Java. Ponieważ jednak Python jest dynamiczny, łatwe jest utworzenie ogólnego drzewa. Na przykład drzewem binarnym może być:
Możesz użyć tego w następujący sposób:
źródło
class Tree
z obiektuobject
jest czasem tylko wskazówką: jeśli klasa dziedziczy po żadnej innej klasie bazowej, jawnie dziedziczy po obiekcie. Dotyczy to również klas zagnieżdżonych. Zobacz Przewodnik po stylu Python GoogleOgólne drzewo to węzeł z zerowym lub większą liczbą potomków, z których każdy jest właściwym (drzewnym) węzłem. To nie to samo co drzewo binarne, są to różne struktury danych, chociaż obie mają pewną terminologię.
W Pythonie nie ma wbudowanej struktury danych dla ogólnych drzew, ale łatwo ją zaimplementować za pomocą klas.
źródło
Możesz spróbować:
Jak sugerowano tutaj: https://gist.github.com/2012250
źródło
źródło
Nie ma wbudowanych drzew, ale można je łatwo zbudować, podklasując typ węzła z listy i pisząc metody przejścia. Jeśli to zrobisz, bisect przyda mi się.
Istnieje również wiele implementacji PyPi , które można przeglądać.
O ile dobrze pamiętam, standardowa biblioteka języka Python nie zawiera struktur danych drzewa z tego samego powodu, którego nie zawiera biblioteka klas podstawowych .NET: lokalizacja pamięci jest zmniejszona, co powoduje więcej braków pamięci podręcznej. W nowoczesnych procesorach zwykle szybsze jest po prostu wprowadzenie dużej ilości pamięci do pamięci podręcznej, a struktury danych „bogate we wskaźnik” negują korzyści.
źródło
Zaimplementowałem zrootowane drzewo jako słownik
{child:parent}
. Na przykład z węzłem głównym0
drzewo może wyglądać tak:Ta struktura bardzo ułatwiła przejście w górę ścieżką od dowolnego węzła do katalogu głównego, co było istotne dla problemu, nad którym pracowałem.
źródło
{parent:[leftchild,rightchild]}
.Odpowiedź Grega Hewgilla jest świetna, ale jeśli potrzebujesz więcej węzłów na poziom, możesz użyć listy | słownika, aby je utworzyć: A następnie użyj metody, aby uzyskać do nich dostęp według nazwy lub kolejności (np. Id)
Teraz po prostu utwórz root i zbuduj: ex:
To powinno wystarczyć, abyś zaczął zastanawiać się, jak to zrobić
źródło
działa jako słownik, ale zapewnia tyle zagnieżdżonych nagrań, ile chcesz. Spróbuj wykonać następujące czynności:
dostarczy zagnieżdżony dykt ... który rzeczywiście działa jak drzewo.
... Jeśli masz już dyktandę, każdy poziom zostanie rzucony na drzewo:
W ten sposób możesz edytować / dodawać / usuwać każdy poziom nagrania według własnego uznania. Nadal obowiązują wszystkie metody dyktowania dla przechodzenia itp.
źródło
dict
zamiastdefaultdict
? Z moich testów rozszerzeniedefaultdict
zamiast dict, a następnie dodanieself.default_factory = type(self)
do początku init powinno działać w ten sam sposób.Zaimplementowałem drzewa za pomocą zagnieżdżonych nagrań. Jest to dość łatwe i działa dla mnie z dość dużymi zestawami danych. Poniżej zamieściłem próbkę, a więcej można zobaczyć w kodzie Google
źródło
Na mojej stronie opublikowałem implementację drzewa Python [3]: http://www.quesucede.com/page/show/id/python_3_tree_implementation .
Mam nadzieję, że to się przyda
Ok, oto kod:
źródło
Jeśli ktoś potrzebuje prostszego sposobu, aby to zrobić, drzewo jest tylko rekurencyjnie zagnieżdżoną listą (ponieważ zestaw nie jest mieszalny):
Gdzie każda gałąź jest parą:
[ object, [children] ]
a każdy liść jest parą:
[ object, [] ]
Ale jeśli potrzebujesz zajęć z metodami, możesz użyć dowolnego.
źródło
Jakie operacje potrzebujesz? Często istnieje dobre rozwiązanie w Pythonie za pomocą dykta lub listy z modułem bisect.
Istnieje wiele, wiele implementacji drzew w PyPI , a wiele typów drzew jest prawie trywialnych do implementacji w czystym Pythonie. Jest to jednak rzadko konieczne.
źródło
Kolejna implementacja drzewa luźno oparta na odpowiedzi Bruno :
I przykład, jak go używać:
Które powinny generować:
źródło
Sugeruję bibliotekę Networkx .
Przykład budowy drzewa:
Nie jestem pewien, co rozumiesz przez „ drzewo ogólne ”,
ale biblioteka pozwala, aby każdy węzeł był dowolnym obiektem , który można mieszać , i nie ma ograniczeń co do liczby dzieci, które ma każdy węzeł.
Biblioteka zawiera również algorytmy graficzne związane z drzewami i wizualizacją możliwościami .
źródło
Jeśli chcesz utworzyć strukturę danych drzewa, najpierw musisz utworzyć obiekt treeElement. Jeśli utworzysz obiekt treeElement, możesz zdecydować, jak zachowa się twoje drzewo.
Aby to zrobić, należy wykonać klasę TreeElement:
Teraz musimy użyć tego elementu do stworzenia drzewa, używam drzewa A * w tym przykładzie.
Możesz dodawać / usuwać dowolne elementy z obiektu, ale sprawić, że struktura będzie nienaruszona.
źródło
źródło