[英]python: filter objects from a list with dict fields
我有 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'
]
我想用从“x”变量下方指定的任何字段开始的 dict 字段来过滤它。
x = [b, c, d]
必需的 output 正在过滤除上述列表中指定的元素之外的所有其他元素。
['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 的新手。请帮忙。
在列表推导中使用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']
看起来你需要。
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])
Output:
['b:b1, c:c1, d:d1', 'b:b1, c:c1', 'b:b1, c:c1, d:d1', 'b:b1']
你可以试试这个。
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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.