python:从具有dict字段的列表中过滤对象

时间:2019-11-14 13:52:55

标签: python regex python-3.x

我有python脚本,该脚本以以下格式生成数据(dict)对象。全部用逗号分隔的单引号。

['a:a1, b:b1, c:c1, d:d1', 'a:a1, b:b1, c:c1', 'a:a1, b:b1, c:c1, d:d1, e:e1', 'a:a1, b:b1']

为获得更好的可见性,它看起来像这样

[
'a:a1, b:b1, c:c1, d:d1', 
'a:a1, b:b1, c:c1', 
'a:a1, b:b1, c:c1, d:d1, e:e1', 
'a:a1, b:b1'
]

我想用dict字段对此进行过滤,该字段以从'x'变量下面指定的任何字段开头。

x = [b, c, d]

必需的输出将过滤除上面列表中指定的元素以外的所有其他元素。

['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1', 'b:b1']

再次获得更好的可见度:

[
'b:b1, c:c1, d:d1',    ## first row a eliminated
'b:b1, c:c1',          ## second row a eliminated
'b:b1, c:c1, d:d1',    ## third row a, e eliminated
'b:b1'                 ## fourth row a eliminated
]

我已经在下面尝试过了。

import re

data = ['a:a1, b:b1, c:c1, d:d1', 'a:a1, b:b1, c:c1', 'a:a1, b:b1, c:c1, d:d1, e:e1', 'a:a1, b:b1']
x = ["b", "c", "d"]
data = data_2 = [(','.join(item.split(",")[1:]).strip()) for item in data]
print([re.sub(f"[^{''.join(x)}]:\w+, ", '', s) for s in data])


new = ['a:a1, b:b1, c:c1, d:d1', 'a:a1, b:b1, c:c1', 'a:a1, b:b1, c:c1, d:d1, e:e1', 'a:a1, b:b1']
new = new_2 = [(','.join(item.split(",")[1:]).strip()) for item in new]
y = {'b', 'c', 'd'} #use a set here instead for performance
print([','.join(d for d in s.split(',') if d[0] in y) for s in new])

#output
['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1, e:e1', 'b:b1']
['b:b1', 'b:b1', 'b:b1', 'b:b1']

我是python的新手。请帮助。

3 个答案:

答案 0 :(得分:2)

在列表理解中使用re.sub

x = ['b', 'c', 'd']
result = [re.sub(f"[^{''.join(x)}]:\w+,? ?", '', s) for s in data]

或者使用使用str.split的嵌套理解:

x = {'b', 'c', 'd'} #use a set here instead for performance
result = [','.join(d for d in s.split(',') if d[0] in x) for s in data]

结果:

['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1', 'b:b1']

答案 1 :(得分:1)

看起来像您需要的。

data = [
'a:a1, b:b1, c:c1, d:d1', 
'a:a1, b:b1, c:c1', 
'a:a1, b:b1, c:c1, d:d1, e:e1', 
'a:a1, b:b1'
]

x = ["b", "c", "d"]
print([" ".join(j for j in i.split() if any(n in j for n in x)).rstrip(",") for i in data])
#or
print([" ".join(j for j in i.split() if any(j.startswith(n) for n in x)).rstrip(",") for i in data])

输出:

['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1', 'b:b1']

答案 2 :(得分:1)

您可以尝试一下。

data  = [
'a:a1, b:b1, c:c1, d:d1', 
'a:a1, b:b1, c:c1', 
'a:a1, b:b1, c:c1, d:d1, e:e1', 
'a:a1, b:b1'
]

x = ['b', 'c', 'd']

data_2 = [','.join(filter(lambda i: i.strip()[0] in x, item.split(','))).strip() for item in data]

print(data_2)

结果:

['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1', 'b:b1']