【问题标题】:Python: iterate through list and check for matching sub-string in specific parts of stringPython:遍历列表并检查字符串特定部分中的匹配子字符串
【发布时间】: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


【解决方案1】:

由于您知道每个列表项的最后一个字符需要在同一个位置完全匹配,因此首先检查它的成本较低。否则代码会做不必要的工作,即使它确实不需要。使用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% 的迭代检查可能返回错误。

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2015-07-27
    • 2013-03-07
    • 2021-10-02
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多