【发布时间】:2016-01-02 00:12:22
【问题描述】:
我有一个字符串列表 a 和一个元组列表 b 其中:
a=['from src1 to dest2','from src3 to dest4','from src5 to dest6']
b=[['destb','dest2'],['destd','loc4'],['destf','dest6'],['desth','dest8']]
a 和 b 的长度可以不同且不相等。
我想遍历a,检查'dest'是否与每个元组中的第一个字符串匹配,如果匹配,则将其替换为第二个字符串,并将其附加到新列表中。如果未找到匹配项,我想将未更改的字符串追加到列表中。
所以它应该看起来像这样:
newlist=['from src1 to destb','from src3 to destd','from src5 to destf']
我当前的代码如下所示:
for source_dest_statement in source_dest_statements:
for i,j in in source_dest_tuple:
if j in source_dest_statement:
amended_source_dest_statements.append('SOMETHING HAS CHANGED!')
amended_source_dest_statements.append(re.sub(j,i,source_dest_statement))
else:
amended_source_dest_statements.append(source_dest_statement)
正如预期的那样,当没有匹配项时,这会重复附加当前迭代的 source_dest_statement,而我需要它们只出现在原始列表中出现的次数。解决此问题的最简单方法是什么?
编辑:我将尝试解释我要解决的问题:
我有一个防火墙配置,其中包含许多 NAT 语句。这些语句在更新版本的代码中发生了变化,因此在目标地址使用映射地址的地方,它们现在使用真实地址。
我的元组列表是映射地址对的真实地址列表。所以像 [(realaddress1,mappedaddress1),(r2,m2),(r3,m3)] 等等。
我有我想要通过的旧访问列表规则库,并将所有对映射地址的引用替换为对应的真实地址。
我正在尝试做的事情: - 遍历访问列表规则。 - 如果找到映射地址匹配,修改规则,附加到列表,插入说明规则已修改的注释。 - 如果未找到匹配项,则将现有规则附加到列表中。
编辑 - 解决方案
for/else 语句解决了我的问题。所以它看起来像这样: 对于一些列表中的currline: 对于 i,j 在某些情况下: 如果 j 在 curlline 中: newlistoflines.append(re.sub(j,i,currline)) 休息 别的: newlistoflines.append(currline)
感谢大家的帮助!我现在知道 break 语句并不邪恶,但我仍然想知道是否有更优雅的方法来解决我的问题。
【问题讨论】:
-
我认为预期的新列表是错误的提供正确的预期输出
-
b不是list的tuples,而是list的lists -
你说得对,我会修改@Joe R,我会修改我的例子。
-
“a”列表中的“dst6”是错字吗?好像应该是dest6。
-
老实说,我认为你需要重新考虑你在做什么。这些不是解决这个问题的正确数据结构。你能问一个你想要解决的问题,而不是问我们你的解决方案吗?如果您提供更多详细信息,我认为我们可以为您提供更多帮助。不过由你决定。
标签: python string list list-comprehension