मेरे पास एक फ्लैट टेक्स्ट फ़ाइल है जो पदानुक्रम का प्रतिनिधित्व करती है। यह इस तरह दिखता है:

0 tom (1)
1   janet (8)
2     harry (1)
3       jules (1)
3       jacob (1)
1   mary (13)
2     jeff (1)
3       sam (2)
1   bob (28)
2     dick (1)

मैं इसे पढ़ना चाहता हूं और पदानुक्रम का प्रतिनिधित्व करने के लिए नेस्टेड डिक्शनरी (या किसी प्रकार की डेटा संरचना) बनाना चाहता हूं, इसलिए इसे प्रबंधित करना आसान है लेकिन मैं अपने सिर को डेटा संरचना को फिर से चलाने और बनाने के तरीके के आसपास नहीं लपेट सकता। शायद रिकर्सन?

पहली संख्या पदानुक्रम का स्तर है, शब्द वह नाम है जिसे मैं संग्रहीत करना चाहता हूं और कोष्ठक में मान वह मात्रा है जिसे मैं भी संग्रहीत करना चाहता हूं।

मैं इसके समान कुछ समाप्त करना चाहता हूं:

{
  "tom": {
    "quantity": 1,
    "names": {
      "janet": {
        "quantity": 8,
        "names": {
          "harry": {
            "quantity": 1,
            "names": {
              "jules": {
                "quantity": 1
              },
              "jacob": {
                "quantity": 1
              }
            }
          }
        }
      },
      "mary": {
        "quantity": 13,
        "names": {
          "jeff": {
            "quantity": 1,
            "names": {
              "sam": {
                "quantity": 2
              }
            }
          }
        }
      },
      "bob": {
        "quantity": 28,
        "names": {
          "dick": {
            "quantity": 1
          }
        }
      }
    }
  }
}
1
Greg G. 19 अप्रैल 2021, 20:41

1 उत्तर

सबसे बढ़िया उत्तर

आप रिकर्सन का उपयोग कर सकते हैं:

import re
with open('test_hierarchy.txt') as f:
   d = [[int((k:=re.findall('\d+|\w+', i))[0]), k[1], int(k[-1])] for i in f]

def to_tree(data):
   if not data:
      return {}
   r, _key, _val = {}, None, []
   for a, b, c in data:
      if not a:
         if _key is not None:
            r[_key[0]] = {'quantity':_key[-1], 'names':to_tree(_val)}
         _key, _val = (b, c), []
      else:
         _val.append([a-1, b, c])
   r = {**r, _key[0]:{'quantity':_key[-1], 'names':to_tree(_val)}}
   return {a:{'quantity':b['quantity']} if not b['names'] else b for a, b in r.items()}

import json
print(json.dumps(to_tree(d), indent=4))

आउटपुट:

{
  "tom": {
     "quantity": 1,
     "names": {
        "janet": {
            "quantity": 8,
            "names": {
                "harry": {
                    "quantity": 1,
                    "names": {
                        "jules": {
                            "quantity": 1
                        },
                        "jacob": {
                            "quantity": 1
                        }
                    }
                }
            }
        },
        "mary": {
            "quantity": 13,
            "names": {
                "jeff": {
                    "quantity": 1,
                    "names": {
                        "sam": {
                            "quantity": 2
                        }
                    }
                }
            }
        },
        "bob": {
            "quantity": 28,
            "names": {
                "dick": {
                    "quantity": 1
                }
             }
          }
      }
   }
}
0
Ajax1234 19 अप्रैल 2021, 20:55