【问题标题】:Searching for a substring match in a string list with 2 lists在具有 2 个列表的字符串列表中搜索子字符串匹配
【发布时间】:2018-05-25 16:41:23
【问题描述】:

我有 2 个正在尝试使用的列表。第一个是 nameList,它对应于我想要在其中找到匹配项的名称,第二个列表是该命名列表的状态。我希望能够查看第一个列表并在字符串中查找匹配项,如果有匹配项,则将第一个列表中的元素抓取到一个新列表中,并抓取第二个列表中的相应元素以获取名称和状态对。我已经尝试了几种方法,但未能正确解决,并查看了板上的各种列表理解问题,但无法找到适合我的情况的解决方案。

例如,在下面的代码中,我想获取 'abc-1' 和 'abc-2' 条目以及这两个条目的 'ok' 和 'ok' 状态并将它们输出为finalNameList 和 finalStatusList。

如果有人能提供任何帮助,我将不胜感激。

在我当前的实现中,我得到了一个 类型错误:'预期的字符串或缓冲区'

import re
import os
import sys
import getopt
import pdb

nameList = ['abc-1', 'abc-2', 'def-1', 'def-2']
statusList = ['ok', 'ok', 'bad', 'bad']
scac = 'abc'


def scacFilter (scac, nameList, statusList):
    if not scac:
        newNameList = nameList
        newStatusList = statusList
    else:
        for i in nameList:
            if re.search(scac, i):
                name = nameList[i]
                status = statusList[i]
                newNameList.append(name)
                newStatusList.append(status)
            else:
                print 'no scac match'
    return newNameList, newStatusList


finalNameList, finalStatusList = scacFilter(scac, nameList, statusList)

【问题讨论】:

  • i 是一个整数。因此,您正在整数 i 中搜索字符串 scac。而不是for i in range(len(nameList)): 只是做for i in nameList
  • 不要使用索引,使用zip。例如,for name, status in zip(nameList, statusList):
  • 匹配时,scac 字符串是否始终位于 nameList 字符串的开头?如果是这样,不要使用正则表达式,使用name.startswith(scac)

标签: python regex list substring


【解决方案1】:

import os

nameList = ['abc-1', 'abc-2', 'def-1', 'def-2']
statusList = ['ok', 'ok', 'bad', 'bad']
scac = 'abc'


def scacFilter (scac, nameList, statusList):
    resultList = []
    resultVal = []
    for val in nameList:
        if not val.find(scac):
            indexVal = nameList.index(val)
            resultList.append(nameList[indexVal])
            resultVal.append(statusList[indexVal])
    return resultList, resultVal
finalNameList, finalStatusList = scacFilter(scac, nameList, statusList)
print finalNameList
print finalStatusList

【讨论】:

    【解决方案2】:

    i 是一个整数。所以正则表达式是在整数值中搜索scac 中定义的字符串。即它正在1 中搜索'abc'

    创建 for 循环的更好方法是:

    for i in nameList:
    

    这样,i 实际上是nameList 中的字符串(即'abc-1''abc-2' 等...)而不是整数,因此您将在您想要的字符串上执行您的正则表达式到!

    【讨论】:

    • 感谢您了解这一点,我对 Python 还是很陌生。我不敢相信我错过了。一个快速跟进的问题,我按照建议修改了代码。我有点不清楚如何访问相同索引处的“状态”。任何有关如何在该指数中提取状态的指导将不胜感激。
    • 您可以简单地在 nameList 上使用 index() 方法和 nameList.index('abc-1'),然后使用生成的整数值访问其他列表的索引。抱歉没有语法高亮,我现在正在打电话。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多