Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Random832 Newsgroups: comp.lang.python Subject: Re: Extract the middle N chars of a string Date: Wed, 18 May 2016 17:28:43 -0400 Lines: 37 Message-ID: References: <573c8e97$0$1596$c3e8da3$5496439d@news.astraweb.com> <1463606923.1353025.611955401.37F5D0F6@webmail.messagingengine.com> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Trace: news.uni-berlin.de JOfIhc4LO0+PvN3zKLKOvwFmY+Dl6xIsV9AtNBC58LqQ== Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.001 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'elif': 0.04; 'seemed': 0.07; 'strings.': 0.07; '"""return': 0.09; 'received:internal': 0.09; 'subject:string': 0.09; 'def': 0.13; 'wed,': 0.15; 'clear.': 0.16; 'message-id:@webmail.messagingengine.com': 0.16; 'received:10.202': 0.16; 'received:10.202.2': 0.16; 'received:66.111': 0.16; 'received:66.111.4': 0.16; 'received:io': 0.16; 'received:messagingengine.com': 0.16; 'received:psf.io': 0.16; 'wrote:': 0.16; 'string': 0.17; 'odd': 0.18; 'algorithm': 0.20; 'purposes': 0.20; 'function,': 0.22; 'this:': 0.23; 'header :In-Reply-To:1': 0.24; "doesn't": 0.26; "i'm": 0.30; 'statement': 0.32; 'problem': 0.33; "d'aprano": 0.33; 'errors,': 0.33; 'steven': 0.33; 'could': 0.35; 'returning': 0.35; 'but': 0.36; 'skip:i 20': 0.36; 'there': 0.36; 'cases': 0.36; 'to:addr:python- list': 0.36; 'subject:: ': 0.37; 'received:10': 0.37; 'received:66': 0.38; 'end': 0.39; 'subject:the': 0.39; 'rather': 0.39; 'to:addr:python.org': 0.40; 'header:Message-Id:1': 0.61; 'more': 0.63; 'special': 0.73; 'yours': 0.89 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=fastmail.com; h= content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-sasl-enc :x-sasl-enc; s=mesmtp; bh=66apGcnhfAIHavHRJzLOQJQaOJc=; b=Ugsu2m SLbcpjMBEjcQVkKqYIVGcOdN8UCB5WyHczM1IfL1VqfFNRR3eG4GzTpcJSmeO0HR CumUDEu77a0RU7iV2BUDz4NNoUwzx1ZIT0LqsX0fKAH0IcEEPaHFRfhoZEBRsKli 8e3m6MiHDBPPlCJpXkhKedeS4PFZ1j/n+57bo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=66apGcnhfAIHavH RJzLOQJQaOJc=; b=Ws+pxI5t4+PP9s9zBRzKU5CXrKbzl+hauROubbjBPScmTl9 oknlfyR2AYelmHCvkhXZZ1dkE8BL1bRDploD93JTXevHWn07JPfchU5SFWd4GEwn rDOI9d6fD/t1l05SYfyeq7/Jofq5dRRZeBvxnStLlBy0uheXseDYjiKSqcJQ= X-Sasl-Enc: +VZaEw0Tl8AG3HsdHgvorw9b+JJqXVCNUYhO3gea3IjC 1463606923 X-Mailer: MessagingEngine.com Webmail Interface - ajax-9bce2c97 In-Reply-To: <573c8e97$0$1596$c3e8da3$5496439d@news.astraweb.com> X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <1463606923.1353025.611955401.37F5D0F6@webmail.messagingengine.com> X-Mailman-Original-References: <573c8e97$0$1596$c3e8da3$5496439d@news.astraweb.com> Xref: csiph.com comp.lang.python:108785 On Wed, May 18, 2016, at 11:47, Steven D'Aprano wrote: > So after spending a ridiculous amount of time on what seemed like it > ought > to be a trivial function, and an embarrassingly large number of > off-by-one > and off-by-I-don't-even errors, I eventually came up with this: > > def mid(string, n): > """Return middle n chars of string.""" > L = len(string) > if n <= 0: > return '' > elif n < L: > Lr = L % 2 > a, ar = divmod(L-n, 2) > b, br = divmod(L+n, 2) > a += Lr*ar > b += Lr*br > string = string[a:b] > return string My take: def mid(string, n): if n > len(string): n = len(string) if n <= 0: n = 0 offset = int(len(string)/2+n/2) return string[offset:offset+n] It doesn't get the same result as yours when the length is odd and N is even, but the problem is ambiguous there and I feel like my algorithm is more clear. I'm funneling the special cases through the slice statement at the end rather than simply returning string and '' because it's conceptually nicer and because it could be used for other purposes than slicing strings.