对于字符串列表中的所有字符串,如果字符串的前两个字符中的任何一个匹配(按任何顺序),则检查后两个字符串中的任何一个是否按特定顺序匹配。如果是这样,我将在图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%的迭代测试将返回false。欢迎提出建议!
答案 0 :(得分:0)
由于您知道每个列表项的最后一个字符需要在同一个地方绝对匹配,因此首先检查它是否便宜。代码在其他方面做了不必要的工作,即使它确实不需要。使用timeit
,您可以通过进行一些更改来确定计算时间的差异,例如首先检查最后一个字符:
import timeit
d = ['BEBC', 'ABRC']
def test1():
if (d[0][len(d[0])-1] is d[1][len(d[1])-1]):
for i in range(0,2):
if(d[0][i] in d[1][:2]):
return(d[0],d[1])
print(test1())
print(timeit.timeit(stmt=test1, number=1000000))
<强>结果:强>
('BEBC', 'ABRC')
2.3587113980001959
原始代码:
d = ['BEBC', 'ABRC']
def test2():
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]):
return(d[i],d[j+1])
print(test2())
print(timeit.timeit(stmt=test2, number=1000000))
<强>结果:强>
('BEBC', 'ABRC')
3.1525327970002763
现在让我们取最后一个列表值并进行更改,以便最后一个字符C
不匹配:
d = ['BEBC', 'ABRX']
新代码:
None
0.766526217000318
<强>原始强>
None
2.963771982000253
这显然会在迭代项目的顺序方面得到回报 - 特别是考虑到90%的迭代检查是否可以返回错误。