- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个如下所示的 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"/>
...
请注意,存在成对的“从”到“到”,反之亦然。 (在上面的示例中,只有 ("0/0","0/1")
和 ("0/1","0/0")
对可见,但每个条目都有一个伙伴。)另请注意,这些对没有排序。
该文件描述 SUMO 内的边缘网络模拟。我想为不同的街道随机分配新的速度。然而,每<edge>
条目仅描述街道的一个方向(车道)。因此,我需要找到它的“伙伴”。
以下代码仅按车道分配速度值:
import xml.dom.minidom as dom
import random
edgexml = dom.parse("plain.edg.xml")
MAX_SPEED_OPTIONS = ["8","9","10"]
for edge in edgexml.getElementsByTagName("edge"):
x = random.randint(0,2)
edge.setAttribute("speed", MAX_SPEED_OPTIONS[x])
是否有一种简单的(Pythonic)方法可以将这些对收集到元组中,然后为两者分配相同的值?
如果您知道使用 SUMO 工具解决我的问题的更好方法,我也会很高兴。不过,我仍然对如何解决 python 中给定的抽象列表问题感兴趣,因为它不仅仅是相关问题中的简单 zip。
最佳答案
好吧,您可以遍历边列表并在所有边上嵌套另一个迭代来搜索可能的伙伴。由于这是二次复杂度,我们甚至可以通过仅遍历嵌套运行中尚未访问的边来减少计算时间。
(有关详细说明,请向下滚动)
import xml.dom.minidom as dom
import random
edgexml = dom.parse('sampledata/tmp.xml')
MSO = [8, 9, 10]
edge_groups = []
passed = []
for idx, edge in enumerate(edgexml.getElementsByTagName('edge')):
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)
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))
产生输出:
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_groups = []
passed = []
初始化结果结构edge_groups
,它将是一个列表列表,其中包含分组中的合作边。 passed
的附加列表将帮助我们避免结果中出现冗余边缘。
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)
初始化助手列表以存储识别的合作伙伴边缘。然后,从当前索引开始遍历剩余列表中的所有边。 IE。不要迭代已经在外部迭代中传递的边。如果潜在合作伙伴是实际合作伙伴(来自/结束匹配),则将其附加到我们的合作伙伴
列表中。
edge_groups.append([edge] + partners)
passed.extend([edge] + partners)
嵌套迭代已通过,partners
保存当前边缘
的所有已识别合作伙伴。将它们插入一个列表并将其附加到结果变量edge_groups
。由于检查 2 级列表 Edge_groups 来查看我们是否已经在下一次运行中遍历了一条边是不必要的复杂操作,因此我们将另外保留一个已使用节点的列表并将其称为 通过
。
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_groups
中的所有边缘组,从 MSO
中随机绘制速度(提示:使用 random.choice()
从列表中随机选择),并将其分配给该组中的所有边。
关于python - 根据值对列表中的项目进行配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34289364/
我的问题:非常具体。我正在尝试想出解析以下文本的最简单方法: ^^domain=domain_value^^version=version_value^^account_type=account_ty
好吧,这就是我的困境: 我正在为 Reddit 子版 block 开发常见问题解答机器人。我在 bool 逻辑方面遇到了麻烦,需要一双更有经验的眼睛(这是我在 Python 中的第一次冒险)。现在,该
它首先遍历所有 y 值,然后遍历所有 x 值。我需要 X 和 y 同时改变。 For x = 3 To lr + 1 For y = 2 To lr anyl.Cells(x, 1)
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
如何转换 Z-score来自 Z-distribution (standard normal distribution, Gaussian distribution)到 p-value ?我还没有找到
我正在重写一些 Javascript 代码以在 Excel VBA 中工作。由于在这个网站上搜索,我已经设法翻译了几乎所有的 Javascript 代码!但是,有些代码我无法准确理解它在做什么。这是一
我遇到过包含日期格式的时间戳日期的情况。然后我想构建一个图表,显示“点击”项目的数量“每天”, //array declaration $array1 = array("Date" => 0); $a
我是scala的新手! 我的问题是,是否有包含成员的案例类 myItem:Option[String] 当我构造类时,我需要将字符串内容包装在: Option("some string") 要么 So
我正在用 PHP 创建一个登录系统。我需要用户使用他或她的用户名或电子邮件或电话号码登录然后使用密码。因为我知道在 Java 中我们会像 email==user^ username == user 这
我在 C++ 项目上使用 sqlite,但是当我在具有文本值的列上使用 WHERE 时出现问题 我创建了一个 sqlite 数据库: CREATE TABLE User( id INTEGER
当构造函数是显式时,它不用于隐式转换。在给定的代码片段中,构造函数被标记为 explicit。那为什么在 foo obj1(10.25); 情况下它可以工作,而在 foo obj2=10.25; 情况
我知道这是一个主观问题,所以如果需要关闭它,我深表歉意,但我觉得它经常出现,让我想知道是否普遍偏爱一种形式而不是另一种形式。 显然,最好的答案是“重构代码,这样你就不需要测试是否存在错误”,但有时没有
这两个 jQuery 选择器有什么区别? 以下是来自 w3schools.com 的定义: [attribute~=value] 选择器选择带有特定属性,其值包含特定字符串。 [attribute*=
为什么我们需要CSS [attribute|=value] Selector根本当 CSS3 [attribute*=value] Selector基本上完成相同的事情,浏览器兼容性几乎相似?是否存在
我正在解决 regx 问题。我已经有一个像这样的 regx [0-9]*([.][0-9]{2})。这是 amont 格式验证。现在,通过此验证,我想包括不应提供 0 金额。比如 10 是有效的,但
我正在研究计算机科学 A 考试的样题,但无法弄清楚为什么以下问题的正确答案是正确的。 考虑以下方法。 public static void mystery(List nums) { for (
好的,我正在编写一个 Perl 程序,它有一个我收集的值的哈希值(完全在一个完全独立的程序中)并提供给这个 Perl 脚本。这个散列是 (string,string) 的散列。 我想通过 3 种方式对
我有一个表数据如下,来自不同的表。仅当第三列具有值“债务”并且第一列(日期)具有最大值时,我才想从第四列中获取最大值。最终值基于 MAX(DATE) 而不是 MAX(PRICE)。所以用简单的语言来说
我有一个奇怪的情况,只有错误状态保存到数据库中。当“状态”应该为 true 时,我的查询仍然执行 false。 我有具有此功能的 Controller public function change_a
我有一个交易表(针对所需列进行了简化): id client_id value 1 1 200 2 2 150 3 1
我是一名优秀的程序员,十分优秀!