我有一个名为L <- strsplit(Author,"[()]")[[1]]
L <- L[which(L != "")]
的列表。它有stops
个对象,其中包含属性(字段)stop
,stop_id
和stop_name
。我需要检查所有stop_type
是否都有正确的前缀。
我提出了以下内容,但我确信必须有更好的遍历和匹配方式:
stop_id
答案 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
,迭代结束并返回False
,any()
迭代就会停在第一个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)