回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有两份清单:</p>
<ul>
<li>第一个列表包含顶级名称信息;每个项目有多个描述符</li>
<li>第二个列表保存第一个列表中项目的变体;每个项目也有多个描述符</li>
</ul>
<p>外部(第一个)列表有三个项目<code>name1</code>、<code>name2</code>和<code>name3</code>。还有一个<code>source</code>,但我没有在示例中修改它以保持简单</p>
<p>内部(第二个)列表包含外部列表中的名称和源,然后有自己的名称和源</p>
<p>最终结果应该是这样的:</p>
<pre><code>name1 (source1)
===============
* [name1-foo1]: . "description1"
* [name1-foo2]: . "description2"
* [name1-foo3]: . "description3"
subname1 (subsource1)
---------------
* [name1-sub1-bar1]: . "description1"
* [name1-sub1-bar2]: . "description2"
* [name1-sub1-bar3]: . "description3"
subname2 (subsource1)
---------------
* [name1-sub2-bar1]: . "description1"
* [name1-sub2-bar2]: . "description2"
* [name1-sub2-bar3]: . "description3"
...
</code></pre>
<p>我的问题是,我的外循环查找<code>name</code>和<code>source</code>中的更改,作为打印标题并转到下一个要打印的内容的触发器。但由于内部循环仅由<em>更改</em>触发,因此当外部循环用完时,它不会最后一次运行内部循环以获取所有子项</p>
<pre class="lang-py prettyprint-override"><code>import collections
OuterRecord = collections.namedtuple('OuterRecord',
'name, source, thing, level, description')
InnerRecord = collections.namedtuple('InnerRecord',
'name, source, in_name, in_source, thing, level, description')
o = [
OuterRecord('name1', 'source1', 'name1-foo1', 1, 'description1'),
OuterRecord('name1', 'source1', 'name1-foo2', 5, 'description2'),
OuterRecord('name1', 'source1', 'name1-foo3', 10, 'description3'),
OuterRecord('name2', 'source1', 'name2-foo1', 1, 'description1'),
OuterRecord('name2', 'source1', 'name2-foo2', 5, 'description2'),
OuterRecord('name2', 'source1', 'name2-foo3', 10, 'description3'),
OuterRecord('name3', 'source1', 'name3-foo1', 1, 'description1'),
OuterRecord('name3', 'source1', 'name3-foo2', 5, 'description2')
]
i = [
InnerRecord('name1', 'source1', 'subname1', 'subsource1', 'name1-sub1-bar1', 1, 'description1'),
InnerRecord('name1', 'source1', 'subname1', 'subsource1', 'name1-sub1-bar2', 1, 'description2'),
InnerRecord('name1', 'source1', 'subname1', 'subsource1', 'name1-sub1-bar3', 1, 'description3'),
InnerRecord('name1', 'source1', 'subname2', 'subsource1', 'name1-sub2-bar1', 1, 'description1'),
InnerRecord('name1', 'source1', 'subname2', 'subsource1', 'name1-sub2-bar2', 1, 'description2'),
InnerRecord('name1', 'source1', 'subname2', 'subsource1', 'name1-sub2-bar3', 1, 'description3'),
InnerRecord('name2', 'source1', 'subname3', 'subsource1', 'name2-sub3-bar1', 1, 'description1'),
InnerRecord('name2', 'source1', 'subname3', 'subsource1', 'name2-sub3-bar2', 1, 'description2'),
InnerRecord('name2', 'source1', 'subname3', 'subsource1', 'name2-sub3-bar2', 1, 'description3'),
InnerRecord('name3', 'source1', 'subname4', 'subsource1', 'name3-sub4-bar1', 1, 'description1'),
InnerRecord('name3', 'source1', 'subname4', 'subsource1', 'name3-sub4-bar2', 1, 'description2'),
InnerRecord('name3', 'source1', 'subname4', 'subsource1', 'name3-sub4-bar2', 1, 'description3'),
InnerRecord('name3', 'source1', 'subname5', 'subsource1', 'name3-sub5-bar1', 1, 'description1'),
InnerRecord('name3', 'source1', 'subname5', 'subsource1', 'name3-sub5-bar2', 1, 'description2'),
InnerRecord('name3', 'source1', 'subname5', 'subsource1', 'name3-sub5-bar3', 1, 'description3'),
InnerRecord('name3', 'source1', 'subname6', 'subsource1', 'name3-sub6-bar1', 1, 'description1'),
InnerRecord('name3', 'source1', 'subname6', 'subsource1', 'name3-sub6-bar2', 1, 'description2'),
InnerRecord('name3', 'source1', 'subname6', 'subsource1', 'name3-sub6-bar3', 1, 'description3'),
]
def loop_over(outer_list, inner_list):
current_outer_name = None
current_outer_source = None
current_inner_name = None
current_inner_source = None
for outer in outer_list:
if current_outer_name is None:
print('\n{} ({})'.format(outer.name, outer.source))
print('=' * 15)
current_outer_name = outer.name
current_outer_source = outer.source
if outer.name != current_outer_name or outer.source != current_outer_source:
for inner in [x for x in inner_list if x.name == current_outer_name and x.source == current_outer_source]:
if current_inner_name is None:
print('\n{} ({})'.format(inner.in_name, inner.in_source))
print('-' * 15)
current_inner_name = inner.in_name
current_inner_source = inner.in_source
if inner.in_name != current_inner_name or inner.in_source != current_inner_source:
print('\n{} ({})'.format(inner.in_name, inner.in_source))
print('-' * 15)
current_inner_name = inner.in_name
current_inner_source = inner.in_source
print('* [{}]: . "{}"'.format(inner.thing, inner.description))
print('\n{} ({})'.format(outer.name, outer.source))
print('=' * 15)
current_outer_name = outer.name
current_outer_source = outer.source
print('* [{}]: . "{}"'.format(outer.thing, outer.description))
loop_over(o, i)
</code></pre>
<p>所以我可以在完成所有工作后再次单独运行内部循环,但这闻起来很可怕</p>
<p>有没有更好的方法来组织循环,使其一次完成</p>