একটি ভাল পাইথন ট্রি ডেটা কাঠামো খুঁজছেন [বন্ধ]


92

আমি একটি ভাল ট্রি ডেটা স্ট্রাকচার ক্লাস খুঁজছি। আমি এই প্যাকেজটি জুড়ে এসেছি , তবে যেহেতু আমি পাইথনের তুলনায় তুলনামূলকভাবে নতুন (প্রোগ্রামিং নয়), সেখান থেকে আরও ভাল কোনও আছে কিনা তা আমি জানি না।

আমি পাইথোনিস্টাসের কাছ থেকে এখানে শুনতে চাই - আপনার কাছে এমন কোনও পছন্দের ট্রি স্ক্রিপ্ট রয়েছে যা আপনি নিয়মিত ব্যবহার করেন এবং সুপারিশ করবেন?

[সম্পাদনা]

'ট্রি' দ্বারা স্পষ্ট করার জন্য, আমার অর্থ একটি সরল নিরস্তর গাছ (হুম, কিছুটা পুনরাবৃত্ত সংজ্ঞা দেয় - তবে আশা করি, এটি কিছুটা স্পষ্ট করে)। আমার গাছের প্রয়োজনের বিষয়ে (যেমন ব্যবহারের ক্ষেত্রে)। আমি একটি ফ্ল্যাট ফাইল থেকে গাছের ডেটা পড়ছি এবং আমার ডেটা থেকে একটি গাছ তৈরি করতে হবে এবং গাছের সমস্ত নোডকে অতিক্রম করতে হবে।


কমপক্ষে একটি ট্রিপল সদৃশ ... স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 2482602/ … পাশাপাশি স্ট্যাকওভারফ্লো
এরিক

4
গড় সময়ে, একটি সাধারণ, হালকা ওজন
c0fec0de

উত্তর:


38

আপনার নিজের রোল। উদাহরণস্বরূপ, কেবলমাত্র আপনার গাছকে তালিকার তালিকা হিসাবে মডেল করুন। লোকেরা আরও ভাল প্রস্তাব দেওয়ার আগে আপনার নির্দিষ্ট প্রয়োজনটি বিশদ করা উচিত।

হ্যালো গুডবাইয়ের প্রশ্নের জবাবে, এটি কোনও গাছকে পুনরাবৃত্তি করার জন্য একটি নমুনা কোড।

def walk(node):
    """ iterate tree in pre-order depth-first search order """
    yield node
    for child in node.children:
        for n in walk(child):
            yield n

একটি ধরা হ'ল এই পুনরাবৃত্তিমূলক বাস্তবায়ন হ'ল হে (এন লগ এন)। আমাকে যে সমস্ত গাছের সাথে ডিল করতে হয় তা এটি কাজ করে। পাইথন 3 এর সাবজিনেটর সাহায্য করতে পারে।


আপনি কীভাবে 'অজগর' উপায়ে এই জাতীয় গাছের সমস্ত উপাদানকে ছাপিয়ে যান?
হ্যালো গুডবাই

সাধারণত আপনি ডিএফএস বা বিএফএস ব্যবহার করে একটি গাছ পুনরাবৃত্তি করেন। আমি সাধারণত ডিএফএসের মতো ডিএফ ওয়াক (ট্রি) ব্যবহার করে একটি জেনারেটর প্রয়োগ করি: ...
ওয়াই ইপ তুং

4
ডিএফএস এবং বিএফএস কী? এই সংক্ষিপ্ত শব্দগুলি আমার কাছে নতুন।
হ্যালো গুডবাই

4
ডিএফএসের জন্য একটি নমুনা কোড যুক্ত করা হয়েছে।
ওয়াই ইপ টুং

4
গভীরতা-প্রথম অনুসন্ধানের অর্থ একটি নোডের শিশুরা তার ভাইবোনদের আগে দেখা হয়। সুতরাং আপনার যদি `[এ, [বি, [সি, ডি]], [ই, [এফ, জি]]] have থাকে তবে ধরে নিলে আপনি ই এর পূর্বে বি পরিদর্শন করেছেন, আপনি সি এবং ডিও ই-ব্রেথথ- এর আগে যান প্রথম অনুসন্ধানের অর্থ একই স্তরের সমস্ত নোডগুলি তাদের বাচ্চাদের যে কোনওটির আগে পরিদর্শন করা হয়, সুতরাং বি এবং ই উভয়ই সি, ডি, এফ, বা জি এর আগে পরিদর্শন করা হবে
মার্ক রিড

76

আপনি ডিক্টসের ডাইকের একটি সুন্দর গাছ এটি তৈরি করতে পারেন:

import collections

def Tree():
    return collections.defaultdict(Tree)

আপনি যা চান ঠিক তেমনটি নাও হতে পারে তবে এটি বেশ কার্যকর! মানগুলি কেবল পাতাগুলিতে সংরক্ষণ করা হয়। এটি কীভাবে কাজ করে তার উদাহরণ এখানে:

>>> t = Tree()
>>> t
defaultdict(<function tree at 0x2142f50>, {})
>>> t[1] = "value"
>>> t[2][2] = "another value"
>>> t
defaultdict(<function tree at 0x2142f50>, {1: 'value', 2: defaultdict(<function tree at 0x2142f50>, {2: 'another value'})}) 

আরও তথ্যের জন্য কটাক্ষপাত করা সারকথা


4
বাহ, ডিফল্টডিক্ট ব্যবহার করা একটি উজ্জ্বল ধারণা!
laike9m

দুর্দান্ত এবং আমি প্রাচীর সর্বদা সেটারগুলি ছাড়া চেষ্টা করে ব্যবহার করি।
জিমি কেন

4
একটি খারাপ দিকটি হ'ল গাছের ম্যানিপুলেশন সম্পর্কিত পদ্ধতি যুক্ত করা খুব কৌতুকপূর্ণ। : এছাড়াও এই উইকি এবং autovivification নামক en.wikipedia.org/wiki/Autovivification#Python
denfromufa

41

আমি ব্রেট অ্যালিস্টায়ার ক্রোমক্যাম্প দ্বারা রচিত একটি মডিউল পেয়েছি যা সম্পূর্ণ হয়নি। আমি এটি শেষ করেছি এবং এটি গিথুব এ প্রকাশ্য করেছি এবং এর নতুন নামকরণ করেছি treelib(মূল pyTree):

https://github.com/caesar0301/treelib

এটি আপনাকে সাহায্য করতে পারে ....


4
লাইসেন্স হ'ল জিপিএল, কি করুণা
denfromufa

12
এই লাইসেন্সটি তখন দেওয়া হয়েছিল যখন আমি লাইসেন্সের অর্থ কী তা সম্পর্কে এমনকি অজানা। আমি এটি একটি সহজ কিন্তু দরকারী মডিউল জানি। সংস্করণ 1.3.0 থেকে, আমি এটি অ্যাপাচি লাইসেন্সের অধীনে পুনরায় বিতরণ করছি। আসল কপিরাইট ঘোষণার সাথে আপনি এখন যেখানে এটি প্রয়োজন সেখানে এটি ব্যবহার করতে পারেন।
সিজার0301

9

উপর নির্মাণের একক লাইন বৃক্ষ defaultdict ব্যবহার করে দেওয়া উপরোক্ত উত্তর , আপনি এটি একটি বর্গ করতে পারেন। এটি আপনাকে কোনও কনস্ট্রাক্টরে ডিফল্ট সেট আপ করতে এবং এটির অন্যান্য উপায়ে নির্মাণের অনুমতি দেবে।

class Tree(defaultdict):
    def __call__(self):
        return Tree(self)

    def __init__(self, parent):
        self.parent = parent
        self.default_factory = self

এই উদাহরণটি আপনাকে পিছনে রেফারেন্স তৈরি করতে দেয় যাতে প্রতিটি নোড গাছের মধ্যে তার পিতামাতার সাথে উল্লেখ করতে পারে।

>>> t = Tree(None)
>>> t[0][1][2] = 3
>>> t
defaultdict(defaultdict(..., {...}), {0: defaultdict(defaultdict(..., {...}), {1: defaultdict(defaultdict(..., {...}), {2: 3})})})
>>> t[0][1].parent
defaultdict(defaultdict(..., {...}), {1: defaultdict(defaultdict(..., {...}), {2: 3})})
>>> t2 = t[0][1]
>>> t2
defaultdict(defaultdict(..., {...}), {2: 3})
>>> t2[2]
3

এরপরে, আপনি এমনকি ক্লাস ট্রিতে __setattr__ কে ওভাররাইড করতে পারেন যাতে পিতামাতাকে পুনরায় নিয়োগের সময় এটি সেই পিতামাতার কাছ থেকে শিশু হিসাবে সরিয়ে দেয়। এই নিদর্শন সহ প্রচুর শীতল জিনিস


উপরের উদাহরণে পিতামাতার টি [0] [1] [2] এর জন্য নষ্ট হয়েছে। অ্যাট্রিবিউটআরার: 'ইনট' অবজেক্টটির কোনও 'প্যারেন্ট' নেই
ম্যাথিউউবিজিয়েন

@oao এটি ভাঙ্গা হয়নি। আপনি টি [0] [1] [2] = 3. উল্লেখ করছেন তাই টি [0] [1] [2] কোনও ডিফল্টপ্রকার টাইপ হতে চলেছে না, তবে একটি সংখ্যা টাইপ (ডিফল্টডিক্ট্ট হিসাবে ডিফল্ট হিসাবে ব্যবহৃত হয়) অনুপস্থিত উপাদানসমূহ)। আপনি যদি এটি ডিফল্টডিক্ট্ট হিসাবে চান, আপনার অ্যাসাইনমেন্ট ছাড়াই টি [0] [1] [2] ব্যবহার করতে হবে।
স্যান্ডি চ্যাপম্যান

7

অর্ডারযুক্ত বাচ্চাদের সাথে একটি গাছের জন্য, আমি সাধারণত এই জাতীয় ধরণের কিছু করতাম (যদিও আমি সামান্য কম জেনেরিক, আমি যা করছি তার অনুসারে):

class TreeNode(list):

    def __init__(self, iterable=(), **attributes):
        self.attr = attributes
        list.__init__(self, iterable)

    def __repr__(self):
        return '%s(%s, %r)' % (type(self).__name__, list.__repr__(self),
            self.attr)

আপনি কোনও dictবা ব্যবহারের সাথে তুলনীয় কিছু করতে পারেন DictMixinবা যদি আপনি চাবি দ্বারা অর্ডারযুক্ত বাচ্চাদের অ্যাক্সেস করতে চান তবে এটি আরও আধুনিক বংশধর।



4

এখানে আমি কাজ করছি এমন কিছু।

class Tree:
    def __init__(self, value, *children):
        '''Singly linked tree, children do not know who their parent is.
        '''
        self.value = value
        self.children = tuple(children)

    @property
    def arguments(self):
        return (self.value,) + self.children

    def __eq__(self, tree):
        return self.arguments == tree.arguments

    def __repr__(self):
        argumentStr = ', '.join(map(repr, self.arguments))
        return '%s(%s)' % (self.__class__.__name__, argumentStr)

যেমন ব্যবহার করুন (উদাহরণ হিসাবে মান হিসাবে ব্যবহৃত নম্বর): t = Tree(1, Tree(2, Tree(4)), Tree(3, Tree(5)))


3

হায় BTrees সাহায্য করেছিল? তারা জোপ অবজেক্ট ডাটাবেস কোডের অংশ're পুরো জেওডবি প্যাকেজটি ডাউনলোড করা কিছুটা ওভারকিল, তবে আমি আশা করি বিটিস মডিউলটি অন্তত কিছুটা পৃথকযোগ্য হবে।


2

আমি মনে করি, আরও উন্নত ডেটা স্ট্রাকচারের সমস্যা নিয়ে আমার নিজের অভিজ্ঞতা থেকে, আপনি এখানে করতে পারেন এমন সবচেয়ে গুরুত্বপূর্ণ কাজটি হ'ল ডেটা স্ট্রাকচার হিসাবে ট্রেসের সাধারণ ধারণার উপর একটি ভাল জ্ঞান অর্জন করা। আপনি যদি ধারণার পিছনে বেসিক প্রক্রিয়াটি বুঝতে পারেন তবে এটি আপনার সমস্যার সাথে খাপ খায় এমন সমাধানটি কার্যকর করা সহজ হবে। ধারণাটি বর্ণনা করার জন্য প্রচুর উত্স রয়েছে। বছর কয়েক আগে এই বিশেষ সমস্যার বিষয়ে আমাকে কী "সংরক্ষণ" করা হয়েছিল তা "কম্পিউটারের প্রোগ্রামিং এর আর্ট" এর ২.৩ অনুচ্ছেদ ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.