繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM