[英]Filter down list of elements by comparing their name properties to a list of potential partial matches
我在 python 和 Revit 工作,我有一个带有名称参数的详细信息项目列表。 我想过滤我的列表,只过滤名称包含部分匹配列表中任何字符串的部分匹配项的详细信息项。 我有一个可行的解决方案,但我的直觉告诉我应该有一种方法来简化它,因为它对我来说可读性不太好。
这有效:
filtered_detail_items = filter(lambda x: filter_partial_match(
key = x.LookupParameter('DMER_Panel_Name').AsString(),
partial_keywords = ['TAP BOX', 'VFD', 'CONTROL PANEL', 'DISC'],
inclusive = False),
detail_items)
def filter_partial_match(key, partial_keywords, inclusive = True):
# Allow user to pass in a single string or a list of strings.
# If a single string, treat it as a list.
if type(partial_keywords) is not list: partial_keywords = [ partial_keywords ]
match_found = False
if any(x in key for x in partial_keywords):
match_found = True
if inclusive:
return match_found
else:
return not match_found
这不是:
filtered_detail_items = [(lambda x: (if any(y in x.LookParameter('DMER_Panel_Name').AsString() for y in ['TAP BOX', 'VFD', 'CONTROL PANEL', 'DISC']): x)) for x in detail_items ]
在列表理解中不需要lambda
。 直接在生成器的if
条件中调用该函数。
filtered_detail_items = [
x for x in detail_items
if filter_partial_match(
key = x.LookupParameter('DMER_Panel_Name').AsString(),
partial_keywords = ['TAP BOX', 'VFD', 'CONTROL PANEL', 'DISC'],
inclusive = False)
]
如果您想在不定义filter_partial_match()
函数的情况下执行此操作,则必须从正文中提取代码并对参数进行硬编码。
filtered_detail_items = [
x for x in detail_items
if not any(y in x.LookupParameter('DMER_Panel_Name').AsString() for y in ['TAP BOX', 'VFD', 'CONTROL PANEL', 'DISC'])
]
根据Jeremy和Barmar的评论,这是我使用的最终解决方案:
#filter out partial_matches that we don't want in the names.
partial_matches = ['TAP BOX', 'VFD', 'CONTROL PANEL', 'DISC']
first_item = riser_detail_items.FirstElement()
if first_item:
name_definition = first_item.LookupParameter('DMER_Panel_Name').Definition
riser_detail_items = [
x for x in riser_detail_items
if not any(
partial_match in x.get_Parameter(name_definition).AsString()
for partial_match in partial_matches
)
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.