operator.attrgetter
과 itertool.groupby
을 사용하여 텍스트 문자열을 공백으로 분리하여 텍스트 사이의 공백을 유지합니다. 이것은 예상 된 동작입니다 :부정 연산자`.airrgetter`
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'
0에서 반환 된 값을 어떻게 무효화 할 수 있습니까? 키 기능을위한?
그냥 반전하고 사용하는 자신의 함수를 작성하십시오. – jonrsharpe
나는 람다에 의지하지 않고 얻을 수있는 가장 가까운 것이'' ".__ ne__'라고 생각합니다. –
이 특정 질문에서, 당신은 실제로 여기서 함수를 무효화 할 필요가 없습니다. 단지 if/else 표현식의 조건을 무효로하십시오. 그래서'x if y else z'는'x가 아닌 경우 x '가됩니다. 예. k가 아닌 다른 경우 (len (l), ""), 처리 된 k]의 결과는 [result = [(len (l) 'attrgetter ("isspace")'에'str.isspace'를 사용할 수도 있습니다. – Dunes