【发布时间】:2015-06-17 10:49:12
【问题描述】:
对于字符串列表中的所有字符串,如果字符串的前两个字符中的任何一个匹配(以任何顺序),则检查最后两个字符串中的任何一个是否以特定顺序匹配。如果是这样,我将在图 G 中的两个顶点之间添加一条边。
示例: d = ['BEBC', 'ABRC']
由于前两个字符中的“B”和后两个字符中的“C”匹配,我将添加一条边。我对 Python 还很陌生,而且我通过以前的搜索得出的内容似乎过于冗长:
for i in range(0,len(d)-1):
for j in range(0,len(d)-1):
if (d[i][0] in d[j+1][:2] or d[i][1] in d[j+1][:2]) and \
(d[i][2] in d[j+1][2] or d[i][3] in d[j+1][3]):
G.add_edge(d[i],d[j+1])
下一步是想出一种更快的迭代方法,因为可能只有 1 到 3 条边连接每个节点,因此 90% 的迭代测试将返回错误。欢迎提出建议!
【问题讨论】:
-
先检查最后一个字符可能会更有效。
-
@I'L'l 为什么会这样?
-
您的标签中有“正则表达式”。我不认为正则表达式有更快的解决方案。
-
在ILI的地方回答:并非if语句中的所有条件都被执行,只有那些从左到右需要知道最终结果的条件。在
(a or b) and (c or d)中,如果 a 评估为 true,则不会评估 b,因为a or b将始终为 true。如果a or b为 false,则不会计算 c 和 d。d[i][0] in d[j+1][:2]比d[i][2] in d[j+1][2]贵。 -
@ Lorenz Meyer - 好点。感谢您的反馈。所以听起来我并没有错过任何主要的捷径或更“Phythonic”的表达方式。
标签: string list python-2.7