Я хотел бы использовать operator.attrgetter
и itertool.groupby
, чтобы разделить строку текста пробелами, сохраняя количество пробелов между текстом. Это ожидаемое поведение:Отрицание `operator.attrgetter`
result = process('Am G C')
assert result == [(2, 'Am'), (20, ' '), (1, 'G'), (10, ' '), (1, 'C')]
Как я сказал, что я хотел бы использовать attrgetter
, потому что я считаю его более вещим, чем при использовании лямбды. Я могу сделать:
text = '''Am G C'''
processed=((k, list(l))for k, l in groupby(text, attrgetter("isspace")))
result = [(len(l), "".join(l)) if k else (len(l), " ") for k, l in processed]
Но это вернет:
[(1, 'A'), (1, 'm'), (20, ' '), (1, 'G'), (10, ' '), (1, 'C')]
Что мне нужно, хотя, как раз наоборот, и я попытался:
from operator import neg, attrgetter
text = '''Am G C'''
processed = ((k,list(l)) for k,l in groupby(text, neg(attrgetter("isspace"))))
result = [(len(l), "".join(l)) if k else (len(l), " ") for k, l in processed]
Это бросает:
TypeError: bad operand type for unary -: 'operator.attrgetter'
Как я могу отменить значение, возвращаемое с attrgetter
для ключевых целей?
Просто напишите свою собственную функцию, чтобы инвертировать ее и использовать. – jonrsharpe
Я думаю, что ближе всего вы получите, не прибегая к лямбда, это '' ".__ ne__'. –
В этом конкретном вопросе вам действительно не нужно отменять функцию здесь, просто отрицайте условие в выражении if/else. Поэтому 'x, если y else z' становится' x, если не y else z'. например. 'result = [(len (l)", ".join (l)), если не k else (len (l)," ") для k, l в обработанном виде]. Вы также можете использовать 'str.isspace' над' attrgetter ("isspace") '. – Dunes