格式化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()