Python:遍历列表并检查字符串特定部分中的匹配子字符串

时间:2015-04-11 21:10:47

标签: string list python-2.7

对于字符串列表中的所有字符串,如果字符串的前两个字符中的任何一个匹配(按任何顺序),则检查后两个字符串中的任何一个是否按特定顺序匹配。如果是这样,我将在图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。欢迎提出建议!

1 个答案:

答案 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%的迭代检查是否可以返回错误。