8

ドット区切りの文字列のリストを変換しようとしています。

['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']

ツリーに入れます (ネストされたリストまたは辞書 - 歩きやすいものなら何でも)。実際のデータには、たまたま長さの異なるドット区切りの部分が 1 ~ 4 個あり、合計で 2200 レコードあります。私の実際の目標は、最初の QComboBox が最初のセット項目 ['one', 'five', 'twelve'] (重複なし) で満たされるように、このデータで 4 つの QComboBox のセットを埋めることです。次に、選択した項目に応じて、2 番目の QComboBox に関連する項目が入力されます。別のネストされたレベルがある場合、'one' の場合は ['two', 'six'] のようになります。

これまでのところ、作業リスト -> ネストされた dicts ソリューションを取得しましたが、通常の dict() を使用しているため、非常に遅いです。そして、ComboBoxesを適切に埋めることが簡単にできるように、defaultdictに再設計するのに苦労しているようです。

私の現在のコード:

def list2tree(m):
    tmp = {}
    for i in range(len(m)):
        if m.count('.') == 0:
            return m
        a = m.split('.', 1)
        try:
            tmp[a[0]].append(list2tree(a[1]))
        except (KeyError, AttributeError):
            tmp[a[0]] = list2tree(a[1])
    return tmp

main_dict = {}
i = 0
for m in methods:
    main_dict = list2tree(m)
    i += 1
    if (i % 100) == 0: print i, len(methods)
print main_dict, i, len(methods)
4

2 に答える 2

25
ls = ['one.two.three.four', 'one.six.seven.eight', 'five.nine.ten', 'twelve.zero']
tree = {}

for item in ls:
    t = tree
    for part in item.split('.'):
        t = t.setdefault(part, {})

結果:

{
 "twelve": {
  "zero": {}
 }, 
 "five": {
  "nine": {
   "ten": {}
  }
 }, 
 "one": {
  "six": {
   "seven": {
    "eight": {}
   }
  }, 
  "two": {
   "three": {
    "four": {}
   }
  }
 }
}
于 2013-05-14T15:55:21.517 に答える