使用Python中的有序键列表,使用列表向下遍历嵌套字典

时间:2018-05-25 04:32:49

标签: python tree

我有一个嵌套的initState()如下:

dict

我得到一个像这样的列表/路径:

d = {'A': [{'B': [{'C': [{'D1':[]}, {'D2': []}]}]}]} # just an example

我想沿着l = ['A','B','C','D1'] 中的路径走,以检索相应的dict值。我写了以下程序:

D1

我想知道是否有更好的方法来实现这一目标。我觉得这种方法有点过于冗长,甚至可能有潜伏的bug。

提前感谢您的回答/建议!

3 个答案:

答案 0 :(得分:2)

我使用了递归方法。

l = ['A','B','C','D1']
# xyz
l = ['A','B','C']
# [{'D1': 'xyz'}, {'D2': []}]
l = ['A','B','C','D3']
# None
l = ['A','B','C','D2']
# []

输出:

<AdditionalIncludeDirectories>
  ..\..\some\dir;
  ..\another\dir;
  ...
</AdditionalIncludeDirectories>

答案 1 :(得分:1)

如何走这样的字典:

<div class="card">
  <div class="card-body">
    <h4 class="card-title">Title</h4>
    <!-- Nav tabs -->
    <div class="vtabs">
      <ul class="nav nav-tabs tabs-vertical" role="tablist">
        <li class="nav-item"> <a class="nav-link active show" data-toggle="tab" href="#home0" role="tab" aria-selected="true"><span class="hidden-sm-up"><i class="ti-home"></i></span> <span class="hidden-xs-down">A0</span> </a> </li>
        {% for i in range(1,5) %}
        <li class="nav-item"> <a class="nav-link" data-toggle="tab" href="#home{{ i }}" role="tab" aria-selected="true"><span class="hidden-sm-up"><i class="ti-home"></i></span> <span class="hidden-xs-down">A{{ i }}</span> </a> </li>
        {% endfor %}
      </ul>
      <!-- Tab panes -->
      <div class="tab-content">
        <div class="tab-pane active show" id="home0" role="tabpanel">
          0
        </div>
        {% for i in range(1,5) %}
        <div class="tab-pane" id="home{{ i }}" role="tabpanel">
          <div class="card">
            <div class="card-body p-b-0">
              <h4 class="card-title">Form header</h4>
              <!-- Nav tabs -->
              <ul class="nav nav-tabs customtab2" role="tablist">
                <li class="nav-item"> <a class="nav-link" data-toggle="tab" href="#home7" role="tab" aria-selected="false"><span class="hidden-sm-up"><i class="ti-home"></i></span> <span class="hidden-xs-down">Home</span></a> </li>
                <li class="nav-item"> <a class="nav-link" data-toggle="tab" href="#profile7" role="tab" aria-selected="false"><span class="hidden-sm-up"><i class="ti-user"></i></span> <span class="hidden-xs-down">Profile</span></a> </li>
                <li class="nav-item"> <a class="nav-link active show" data-toggle="tab" href="#messages7" role="tab" aria-selected="true"><span class="hidden-sm-up"><i class="ti-email"></i></span> <span class="hidden-xs-down">Messages</span></a> </li>
              </ul>
              <!-- Tab panes -->
              <div class="tab-content">
                <div class="tab-pane" id="home7" role="tabpanel">
                  <div class="p-20">
                    <h5>Best Clean Tab ever</h5>
                    <h6>you can use it with the small code</h6>
                    <p>Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a.</p>
                  </div>
                </div>
                <div class="tab-pane p-20" id="profile7" role="tabpanel">2</div>
                <div class="tab-pane p-20 active show" id="messages7" role="tabpanel">3</div>
              </div>
            </div>
          </div>
        </div>
        {% endfor %}
      </div>
    </div>
  </div>
  < /div>

输出:

from copy import deepcopy

def walk_dict(ld, path):
    if isinstance(path, str):
        path = path.split()
    t = deepcopy(ld)
    for key in path:
        if isinstance(t, list):
            try:
                t = [d for d in t if key in d][0]
            except IndexError:
                return
        try:
            t = t[key]
        except KeyError:
            return
    else:
        return t

def main():
    d = {'A': [{'B': [{'C': [{'D1':['values of D1']}, {'D2': "I'm D2"}]}]}]}
    a = 'A B C D1'
    print(walk_dict(d, a))
    a = 'A B C D2'
    print(walk_dict(d, a))
    a = 'A B C D3'
    print(walk_dict(d, a))
    a = 'A B1 C D3'
    print(walk_dict(d, a))


if __name__ == '__main__':
    main()

答案 2 :(得分:0)

您可以使用此递归函数:

all cases passed

输出:

#cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }

        .toolbar-left {
            display: block;
            position: absolute;
            top: 5px;
            left: 5px;
        }

以下是当前答案的时间安排。时间和输入设置的源代码可以作为要点here找到。

enter image description here