Path: csiph.com!usenet.pasdenom.info!news.etla.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed2.news.xs4all.nl!xs4all!newsgate.cistron.nl!newsgate.news.xs4all.nl!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'python.': 0.02; 'skip:[ 20': 0.04; 'value,': 0.04; 'duplicate': 0.07; 'element': 0.07; 'problem:': 0.07; 'suppose': 0.07; '"__main__":': 0.09; '[0,': 0.09; '[1,': 0.09; '__name__': 0.09; 'assuming': 0.09; 'imported': 0.09; 'items)': 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'thus,': 0.09; 'def': 0.12; '-1,': 0.16; 'ascending': 0.16; 'distinct': 0.16; 'enough.': 0.16; 'fine.': 0.16; 'heap': 0.16; 'heapq': 0.16; 'item)': 0.16; 'lengths': 0.16; 'received:80.91.229.3': 0.16; 'received:dip0.t-ipconnect.de': 0.16; 'received:plane.gmane.org': 0.16; 'received:t-ipconnect.de': 0.16; 'seen:': 0.16; 'set()': 0.16; 'ways:': 0.16; 'elements': 0.16; 'wrote:': 0.18; 'bit': 0.19; 'trying': 0.19; 'import': 0.22; 'portion': 0.22; 'separate': 0.22; 'header:User-Agent:1': 0.23; 'simpler': 0.24; 'skip:l 30': 0.24; 'helpful': 0.24; '(or': 0.24; 'sort': 0.25; 'order.': 0.26; 'header:X-Complaints-To:1': 0.27; 'tried': 0.27; 'idea': 0.28; 'thus': 0.29; 'largest': 0.30; 'gives': 0.31; 'code': 0.31; '>>>>': 0.31; 'lists': 0.32; 'covered': 0.32; 'another': 0.32; 'becomes': 0.33; 'actual': 0.34; 'could': 0.34; 'problem': 0.35; 'skip:s 30': 0.35; '(2)': 0.35; 'beyond': 0.35; 'convert': 0.35; 'late': 0.35; 'test': 0.35; 'but': 0.35; 'add': 0.35; 'there': 0.35; 'like,': 0.36; 'sequence': 0.36; 'subject:List': 0.36; 'yield': 0.36; 'next': 0.36; 'should': 0.36; 'behind': 0.37; 'two': 0.37; 'list': 0.37; 'step': 0.37; 'minimum': 0.38; '(3)': 0.38; 'filter': 0.38; 'lists.': 0.38; 'to:addr:python-list': 0.38; 'issue': 0.38; 'to:addr:python.org': 0.39; 'skip:p 20': 0.39; 'received:org': 0.40; 'how': 0.40; 'remove': 0.60; 'skip:u 10': 0.60; 'easy': 0.60; 'solve': 0.60; 'break': 0.61; 'length': 0.61; 'took': 0.61; 'kindly': 0.61; 'first': 0.61; 'back': 0.62; 'making': 0.63; 'address': 0.63; 'email addr:gmail.com': 0.63; 'show': 0.63; 'group,': 0.63; 'sum': 0.64; 'more': 0.64; 'taking': 0.65; 'dear': 0.65; 'approaches': 0.68; 'skip:r 30': 0.69; 'lowest': 0.74; 'increase': 0.74; 'grow': 0.77; 'indefinitely': 0.84; 'subject:Value': 0.84; 'approach.': 0.91 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Peter Otten <__peter__@web.de> Subject: Re: Lowest Value in List Date: Thu, 03 Oct 2013 13:12:26 +0200 Organization: None References: Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7Bit X-Gmane-NNTP-Posting-Host: p5084b123.dip0.t-ipconnect.de User-Agent: KNode/4.7.3 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 140 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1380798665 news.xs4all.nl 16007 [2001:888:2000:d::a6]:57270 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:55407 subhabangalore@gmail.com wrote: > Dear Group, > > I am trying to work out a solution to the following problem in Python. > > The Problem: > Suppose I have three lists. > Each list is having 10 elements in ascending order. > I have to construct one list having 10 elements which are of the lowest > value among these 30 elements present in the three given lists. > > The Solution: > > I tried to address the issue in the following ways: > > a) I took three lists, like, > list1=[1,2,3,4,5,6,7,8,9,10] > list2=[0,1,2,3,4,5,6,7,8,9] > list3=[-5,-4,-3,-2,-1,0,1,2,3,4] > > I tried to make sum and convert them as set to drop the repeating > elements: set_sum=set(list1+list2+list3) > set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, -5, -4, -3, -2]) > > In the next step I tried to convert it back to list as, > list_set=list(set_sum) > gave the value as, > [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, -5, -4, -3, -2] > > Now, I imported heapq as, > import heapq > > and took the result as, > result=heapq.nsmallest(10,list_set) > it gave as, > [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4] > > b) I am thinking to work out another approach. > I am taking the lists again as, > > list1=[1,2,3,4,5,6,7,8,9,10] > list2=[0,1,2,3,4,5,6,7,8,9] > list3=[-5,-4,-3,-2,-1,0,1,2,3,4] > > as they are in ascending order, I am trying to take first four/five > elements of each list,like, > > list1_4=list1[:4] >>>> list2_4=list2[:4] >>>> list3_4=list3[:4] > > Now, I am trying to add them as, > > list11=list1_4+list2_4+list3_4 > > thus, giving us the result > > [1, 2, 3, 4, 0, 1, 2, 3, -5, -4, -3, -2] > > Now, we are trying to sort the list of the set of the sum as, > > sort_sum=sorted(list(set(list11))) > > giving us the required result as, > > [-5, -4, -3, -2, 0, 1, 2, 3, 4] > > If by taking the value of each list portion as 4 gives as less number of > elements in final value, as we are making set to avoid repeating numbers, > we increase element count by one or two and if final result becomes more > than 10 we take first ten. > > Are these approaches fine. Or should we think some other way. > > If any learned member of the group can kindly let me know how to solve I > would be helpful enough. A bit late to the show here's my take. You could separate your problem into three simpler ones: (1) combine multiple sequences into one big sequence (2) filter out duplicate items (3) find the largest items (1) is covered by the stdlib: items = itertools.chain.from_iterable([list1, list2, list3]) (2) is easy assuming the items are hashable: def unique(items): seen = set() for item in items: if item not in seen: seen.add(item) yield item items = unique(items) (3) is also covered by the stdlib: largest = heapq.nlargest(3, items) This approach has one disadvantage: the `seen` set in unique() may grow indefinitely if the sequence passed to it is "long" and has an unlimited number of distinct duplicates. So here's an alternative using a heap and a set both limited by the length of the result: import heapq def unique_nlargest(n, items): items = iter(items) heap = [] seen = set() for item in items: if item not in seen: seen.add(item) heapq.heappush(heap, item) if len(heap) > n: max_discard = heapq.heappop(heap) seen.remove(max_discard) break for item in items: if item > max_discard and item not in seen: max_discard = heapq.heappushpop(heap, item) seen.remove(max_discard) return heap if __name__ == "__main__": print(unique_nlargest(3, [1,2,3,4,5,4,3,2,1,6,2,7])) I did not test it, so there may be bugs, but the idea behind the code is simple: you can remove from the set all items that are below the minimum item in the heap. Thus both lengths can never grow beyond n (or n+1 in my actual implementation).