Ich möchte operator.attrgetter
und itertool.groupby
verwenden, um eine Textzeichenfolge durch Leerzeichen aufzuteilen, wobei die Anzahl der Leerzeichen zwischen dem Text beibehalten wird. Das ist das erwartete Verhalten:Negieren `operator.attrgetter`
result = process('Am G C')
assert result == [(2, 'Am'), (20, ' '), (1, 'G'), (10, ' '), (1, 'C')]
Als ich sagte, ich attrgetter
verwenden mag, weil ich es mehr pythonic finden als eine Lambda verwenden. Ich kann tun:
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]
Das wird aber zurück:
[(1, 'A'), (1, 'm'), (20, ' '), (1, 'G'), (10, ' '), (1, 'C')]
Was ich aber brauchen, ist genau das Gegenteil, und ich versuchte:
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]
Dies wirft:
TypeError: bad operand type for unary -: 'operator.attrgetter'
Wie kann ich den Wert von 0 negierenfür Schlüsselfunktionszwecke?
Schreiben Sie einfach Ihre eigene Funktion, um es umzukehren und zu verwenden. – jonrsharpe
Ich denke, die nächste, die Sie erhalten, ohne auf ein Lambda zurückgreifen, ist "" .__ ne__'. –
In dieser speziellen Frage müssen Sie die Funktion hier nicht wirklich negieren, sondern negieren Sie einfach die Bedingung im If/Else-Ausdruck. Also wird 'x wenn y else z' zu 'x wenn nicht y sonst z'. z.B. 'result = [(len (l)," ".join (l)) wenn nicht k else (len (l)," ") für k, l in processed]'. Sie können auch 'str.ispace' über' attrgetter ("isspace") 'verwenden. – Dunes