如何从python中的对象列表中检查属性

时间:2015-06-22 13:41:09

标签: python list python-2.7

我有一个名为L <- strsplit(Author,"[()]")[[1]] L <- L[which(L != "")] 的列表。它有stops个对象,其中包含属性(字段)stopstop_idstop_name。我需要检查所有stop_type是否都有正确的前缀。

我提出了以下内容,但我确信必须有更好的遍历和匹配方式:

stop_id

2 个答案:

答案 0 :(得分:3)

您可以generator expression使用all()

if not all(stop.stop_id.startswith(prefix) for stop in stops):
    # at least one `stop_id` does *not* start with the prefix

您也可以使用any() function

来表达这一点
if any(not stop.stop_id.startswith(prefix) for stop in stops):
    # at least one `stop_id` does *not* start with the prefix

如果您希望在所有if值都具有前缀时执行stop_id套件,请使用all()而不使用not

if all(stop.stop_id.startswith(prefix) for stop in stops):
    # *all* `stop_id` values start with the prefix

any()all() 短路;一旦找到确定结果的第一个证据,它们就会停止迭代生成器表达式; all()只要发现一个False,迭代结束并返回Falseany()迭代就会停在第一个True

请注意,我使用str.startswith()而不是in来测试id是否以给定前缀开头; in成员资格测试将允许前缀出现在字符串中的任何位置,而不仅仅是开头。

如果您需要列出不匹配的值,请使用列表理解:

not_prefixed = [stop for stop in stops if not stop.stop_id.startswith(prefix)]
if not_prefixed:
    # you have `stop_id` values that are not properly prefixed

我在这里收集了stop个对象,但如果更方便的话,您还可以收集stop_id个值:

not_prefixed = [stop.stop_id for stop in stops if not stop.stop_id.startswith(prefix)]

但如果您只需要获得第一个,那么再次生成表达式就是答案,并结合next() function

not_prefixed = next((stop.stop_id for stop in stops if not stop.stop_id.startswith(prefix)), None)
if not_prefixed is not None:
    # you have at least one stop_id that wasn't prefixed, the first 
    # such is stored in not_prefixed.

答案 1 :(得分:0)

stops,其stop_id无效

invalid_stops = filter(lambda x: not x.stop_id.startswith(prefix), stops)