格式化python列表并搜索模式

格式化python列表并搜索模式,python,list,search,pattern-matching,Python,List,Search,Pattern Matching,我从一个电子表格中得到了数字、文本和日期的混合行 我想找到列表中的元素,一些数字和一些文本 比如说 sg = [500782, u'BMOU9015488', u'SD4', u'CLOSED', -1, '', '', -1] sg = map(str, sg) #sg = map(unicode, sg) #option? if any("-1" in s for s in sg): #do something if matched 我觉得这不是正确的方法,我也在尝试匹配像-

我从一个电子表格中得到了数字、文本和日期的混合行 我想找到列表中的元素,一些数字和一些文本 比如说

sg = [500782, u'BMOU9015488', u'SD4', u'CLOSED', -1, '', '', -1]
sg = map(str, sg) 
#sg = map(unicode, sg) #option?
if any("-1" in s for s in sg):
    #do something if matched  
我觉得这不是正确的方法,我也在尝试匹配像-1.5和-1.5C这样的东西,以及其他意想不到的字符,比如OPEN15和15

我也看过

sg.index("-1")
如果为正,则为匹配(仅适用于直接匹配)


如果您想为每种情况调用函数,请提供一些帮助,我将这样做:

def stub1(elem):
    #do something for match of type '-1'
    return
def stub2(elem):
    #do something for match of type 'SD4'
    return        
def stub3(elem):
    #do something for match of type 'OPEN15'
    return

sg = [500782, u'BMOU9015488', u'SD4', u'CLOSED', -1, '', '', -1]
sg = map(unicode, sg) 
patterns = {u"-1":stub1, u"SD4": stub2, u"OPEN15": stub3} # add more if you want

for elem in sg:
    for k, stub in patterns.iteritems():
        if k in elem:
            stub(elem) 
            break
其中stub1,stub2。。。是包含每个案例代码的函数。 如果字符串包含匹配的子字符串,则将调用它(每个字符串最多调用1次)

你说的“我觉得这不是正确的方法”是什么意思?你没有得到你期望的结果吗?是不是太慢了

也许,您可以按列而不是按行组织数据,并使用更具体的筛选器。如果你想提高速度,我建议使用numpy模块,它有一个非常有趣的函数,名为select()

通过转换numpy数组中的所有行,可以在一次过程中测试多个列。这个功能是惊人的高效和强大!基本上是这样使用的:

import numpy as np

a = array(...)
conds = [a < 10, a % 3 == 0, a > 25]
actions = [a + 100, a / 3, a * 10]
result = np.select(conds, actions, default = 0)

这可能是一种获取索引的愚蠢方法,但它演示了如何使用select()。。。它是有效的:-)

你不觉得这是正确的还是不正确的?这段代码有什么是您不想要的,它缺少了什么?我得到了间歇性的结果,不确定是否应该在MAPI中使用str或unicode如果您要匹配子字符串,请使用字符串。谢谢,我将逐个检查失败的匹配,希望这不会对unicode对象使用str函数。如果它包含非ascii字符,则会使程序崩溃。改用unicode函数,并与unicode literalsNot进行比较。速度不是那么慢,只是不可靠。你说的“不可靠”是什么意思?数据是不可预测的,我发现我正在从数字中提取分数,这和1k其他不属于这个问题的“挑战”。我用过numpy,它是一个很棒的库,谢谢你提醒我这意味着“条件”列表很难写。。。我明白了:-)
a = array(....)
conds = [a <= target, a > target]
actions = [1, 0]
index = select(conds, actions).sum()