Rustom Mody <rustompm...@gmail.com> writes: > On Friday, May 26, 2017 at 5:02:55 PM UTC+5:30, Cecil Westerhof wrote: >> To check if Firefox is running I use: >> if not 'firefox' in [i.name() for i in list(process_iter())]: >> >> It probably could be made more efficient, because it can stop when it >> finds the first instance. >> >> But know I switched to Debian and there firefox is called firefox-esr. >> So I should use: >> re.search('^firefox', 'firefox-esr') >> >> Is there a way to rewrite >> [i.name() for i in list(process_iter())] >> >> so that it returns True when there is a i.name() that matches and >> False otherwise? >> And is it possible to stop processing the list when it found a match? > > 'in' operator is lazily evaluated if its rhs is an iterable (it looks) > So I expect you can replace > if not 'firefox' in [i.name() for i in list(process_iter())]: > with > if not 'firefox' in (i.name() for i in list(process_iter())]):
Surely that should be: if not 'firefox' in (i.name() for i in process_iter()): And that again should be: if any((i.name() == 'firefox') for i in process_iter()): Which can then be made into: if any(i.name().startswith('firefox') for i in process_iter()): Or use a regex match if the condition becomes more complex. Even then, there is re.match to attemp a match at the start of the string, which helps to keep the expression simple. Redundancy of parentheses is a bit subtle above - the generator expression as the sole argument to any() does not need them, and the parentheses of (i.name() == 'firefox') are not necessary. As to early exit: >>> s = iter('abracadabra') >>> any(c == 'c' for c in s) True >>> list(s) ['a', 'd', 'a', 'b', 'r', 'a'] >>> -- https://mail.python.org/mailman/listinfo/python-list