Какой самый простой способ получить все строки, которые не начинаются с символа? - PullRequest
19 голосов
/ 20 июля 2011

Я пытаюсь проанализировать около 20 миллионов строк из текстового файла и ищу способ сделать некоторые дальнейшие манипуляции со строками, которые не начинаются с вопросительных знаков. Я хотел бы решение, которое не использует сопоставление регулярных выражений. Я хотел бы сделать что-то вроде этого:

for line in x:
    header = line.startswith('?')
if line.startswith() != header:
        DO SOME STUFF HERE

Я понимаю, что метод startswith принимает один аргумент, но есть ли какое-нибудь простое решение, чтобы получить все строки из строки, которые НЕ начинаются со знака вопроса? Заранее спасибо за помощь.

Ответы [ 4 ]

34 голосов
/ 20 июля 2011

Используйте выражения генератора, как мне кажется, лучше всего.

for line in (line for line in x if not line.startswith('?')):
    DO_STUFF

Или по-вашему:

for line in x:
    if line.startswith("?"):
        continue
    DO_STUFF

Или:

for line in x:
    if not line.startswith("?"):
        DO_STUFF

Это действительно ваш стиль программирования.Я предпочитаю первый, но, возможно, второй кажется проще.Но мне не очень нравится третий из-за большого отступа.

3 голосов
/ 17 января 2018

Вот хороший однострочный текст, очень близкий к естественному языку.

Определение строки:

StringList = [ '__one', '__two', 'three', 'four' ]

Код, который выполняет действия:

BetterStringList = [ p for p in StringList if not(p.startswith('__'))]
2 голосов
/ 20 июля 2011

Что-то вроде этого, вероятно, то, что вы ищете:

with open('myfile.txt') as fh:
  for line in fh:
    if line[0] != '?': # strings can be accessed like lists - they're immutable sequences.
      continue
    # All of the processing here when lines don't start with question marks.
0 голосов
/ 20 июля 2011

Аналогично ответу Утдемира:

from itertools import ifilterfalse  # just "filterfalse" if using Python 3

for line in ifilterfalse(lambda s: s.startswith('?'), lines):
    # DO STUFF

http://docs.python.org/library/itertools.html#itertools.ifilterfalse
http://docs.python.org/dev/py3k/library/itertools.html#itertools.filterfalse

...