繁体   English   中英

通过将元素的名称属性与潜在的部分匹配列表进行比较来过滤元素列表

[英]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'])
]

根据JeremyBarmar的评论,这是我使用的最终解决方案:

#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.

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