我有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的新手。请帮助。
答案 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']