Python 根据值对列表中的项目进行配对

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)的方法来收集元组中的这些对,然后给它们分配相同的值 如果你知道用

我有一个如下所示的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)的方法来收集元组中的这些对,然后给它们分配相同的值


如果你知道用相扑工具解决我问题的更好方法,我也会很高兴的。然而,我仍然对如何用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))