[英]Format a python list and search for patterns
我从电子表格中获取行,其中包含数字,文本和日期,我想在列表中查找元素,例如一些数字和一些文本
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)
在所有的值将被转换如下:
100
将被添加到的任何值,该值小于10
3
,将由分3
25
任何值都将乘以10
0
博特conds和行动列表,并且必须有相同数量的参数。 在conds的第一个元素都有其行动设定行动的第一要素。
它可以用来确定向量中特定值的索引(尽管这应该使用nonzero() numpy函数完成)。
a = array(....)
conds = [a <= target, a > target]
actions = [1, 0]
index = select(conds, actions).sum()
这可能是获取索引的一种愚蠢的方法,但是它演示了我们如何使用select() ...并且它有效:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.