Python 根据值对列表中的项目进行配对
我有一个如下所示的xml文件:Python 根据值对列表中的项目进行配对,python,xml,list,tuples,Python,Xml,List,Tuples,我有一个如下所示的xml文件: <edge from="0/0" to="0/1" speed="10"/> <edge from="0/0" to="1/0" speed="10"/> <edge from="0/1" to="0/0" speed="10"/> <edge from="0/1" to="0/2" speed="10"/> ... 有没有一种简单(pythonic)的方法来收集元组中的这些对,然后给它们分配相同的值 如果你知道用
<edge from="0/0" to="0/1" speed="10"/>
<edge from="0/0" to="1/0" speed="10"/>
<edge from="0/1" to="0/0" speed="10"/>
<edge from="0/1" to="0/2" speed="10"/>
...
有没有一种简单(pythonic)的方法来收集元组中的这些对,然后给它们分配相同的值
如果你知道用相扑工具解决我问题的更好方法,我也会很高兴的。然而,我仍然对如何用python解决给定的抽象列表问题感兴趣,因为它不只是相关问题中的简单zip。好的,您可以遍历边列表,并在所有边上嵌套另一个迭代以搜索可能的合作伙伴。由于这是二次复杂度,我们甚至可以通过只遍历嵌套运行中尚未访问的边来减少计算时间 解决方案 (有关详细说明,请向下滚动) 产生输出:
NEW EDGE GROUP
E from "0/0" to "0/1" at "8"
E from "0/1" to "0/0" at "8"
NEW EDGE GROUP
E from "0/0" to "1/0" at "10"
NEW EDGE GROUP
E from "0/1" to "0/2" at "9"
详细说明
初始化结果结构edge\u groups
,它将是在组中保存伙伴边的列表列表。通过的附加列表将帮助我们避免结果中的冗余边
for idx, edge in enumerate(edgexml.getElementsByTagName('edge')):
开始迭代所有边的列表。我在这里使用enumerate
同时获取索引,因为我们的嵌套迭代只会迭代从当前索引开始的子列表,以降低复杂性
if edge in passed:
continue
如果我们以前在任何时间点访问过此边缘,请停止。只有在之前已将边缘识别为另一个列表的合作伙伴时(由于基于索引的子列表),才会发生这种情况。如果它被作为另一个列表的合作伙伴,我们可以毫无疑问地忽略它
partners = []
for partner in edgexml.getElementsByTagName('edge')[idx:]:
if partner.getAttribute('from') == edge.getAttribute('to') \
and partner.getAttribute('to') == edge.getAttribute('from'):
partners.append(partner)
初始化帮助器列表以存储已识别的合作伙伴边。然后,从当前索引开始遍历剩余列表中的所有边。也就是说,不要迭代已经在外部迭代中通过的边。如果潜在合作伙伴是实际合作伙伴(从/到匹配),则将其附加到我们的合作伙伴
列表中
edge_groups.append([edge] + partners)
passed.extend([edge] + partners)
嵌套迭代已通过,合作伙伴
保存当前边缘
的所有已识别合作伙伴。将它们放入一个列表,并将其附加到结果变量edge\u groups
。由于检查两级列表edge\u groups
以查看我们是否在下一次运行中已经遍历了一条边并不必要地复杂,因此我们将另外保留一个已使用节点的列表,并将其称为passed
for e in edge_groups:
print('NEW EDGE GROUP')
x = random.choice(MSO)
for p in e:
p.setAttribute('speed', x)
print(' E from "%s" to "%s" at "%s"' % (p.getAttribute('from'), p.getAttribute('to'), x))
最后,我们遍历结果edge\u groups
中的所有边组,从MSO
中随机抽取一个速度(提示:使用random.choice()
从列表中随机选择),并将其分配给该组中的所有边。这是一个多么好的答案!非常感谢您的详细解释!最重要的是,你甚至跑得非常快。我喜欢你试图降低复杂性的方式。注意:因为只有一个可能的合作伙伴,所以我没有使用合作伙伴
列表。
partners = []
for partner in edgexml.getElementsByTagName('edge')[idx:]:
if partner.getAttribute('from') == edge.getAttribute('to') \
and partner.getAttribute('to') == edge.getAttribute('from'):
partners.append(partner)
edge_groups.append([edge] + partners)
passed.extend([edge] + partners)
for e in edge_groups:
print('NEW EDGE GROUP')
x = random.choice(MSO)
for p in e:
p.setAttribute('speed', x)
print(' E from "%s" to "%s" at "%s"' % (p.getAttribute('from'), p.getAttribute('to'), x))