2013-10-21 6 views
22

बस अजगर के साथ चारों ओर toying शुरू कर दिया निकाला जा रहा है तो मेरे साथ सहन कृपया :)अजगर - सबसे भीतरी सूचियों

निम्न सूची जो नेस्टेड सूचियों में शामिल मान लें:

[[[[[1, 3, 4, 5]], [1, 3, 8]], [[1, 7, 8]]], [[[6, 7, 8]]], [9]] 

एक अलग प्रतिनिधित्व में:

[ 
    [ 
     [ 
      [ 
       [1, 3, 4, 5] 
      ], 
      [1, 3, 8] 
     ], 
     [ 
      [1, 7, 8] 
     ] 
    ], 
    [ 
     [ 
      [6, 7, 8] 
     ] 
    ], 
    [9] 
] 

आप इन आंतरिक सूचियों को निकालने के बारे में कैसे जाएंगे ताकि निम्नलिखित फॉर्म के साथ परिणाम लौटाया जा सके:

[[1, 3, 4, 5], [1, 3, 8], [1, 7, 8], [6, 7, 8], [9]] 

बहुत धन्यवाद!

संपादित करें (धन्यवाद @falsetru):

खाली भीतरी सूची या मिश्रित प्रकार सूचियों इनपुट का हिस्सा कभी नहीं होगा।

def get_inner(nested): 
    if all(type(x) == list for x in nested): 
     for x in nested: 
      for y in get_inner(x): 
       yield y 
    else: 
     yield nested 

list(get_inner(nested_list)) के आउटपुट::

+2

क्या के लिए वापस आ जाना चाहिए '[[[[[1, 3, 4, 5]], [1, 3, 8]] , [[1, 7, 8]]], [[[6, 7, 8]]], [9, [10]]] 'और' [[[[[1, 3, 4, 5]], [1, 3, 8]], [[1, 7, 8]]], [[[6, 7, 8]]], []] '? – falsetru

+0

स्पष्टीकरण प्रश्न के लिए धन्यवाद: मिश्रित प्रकार के आइटम के साथ एक खाली सूची या सूची कभी भी –

उत्तर

32

यह [1,2,[3]] की तरह कोई 'मिश्रित' सूचियों संभालने काम करने के लिए लगता है,

[[1, 3, 4, 5], [1, 3, 8], [1, 7, 8], [6, 7, 8], [9]] 

या भी कम, जेनरेटर के बिना, जिसके परिणामस्वरूप सूचियां संयोजित करने sum का उपयोग कर :

def get_inner(nested): 
    if all(type(x) == list for x in nested): 
     return sum(map(get_inner, nested), []) 
    return [nested] 
+0

सुंदर का हिस्सा नहीं होगी! धन्यवाद :) –

13

का उपयोग करना:

from itertools import chain 

def get_inner_lists(xs): 
    if isinstance(xs[0], list): # OR all(isinstance(x, list) for x in xs) 
     return chain.from_iterable(map(get_inner_lists, xs)) 
    return xs, 

isinstance(xs[0], list) बजाय प्रयोग किया all(isinstance(x, list) for x in xs) की, वहाँ कोई मिश्रित सूची/खाली भीतरी सूची है, क्योंकि।


>>> list(get_inner_lists([[[[[1, 3, 4, 5]], [1, 3, 8]], [[1, 7, 8]]], [[[6, 7, 8]]], [9]])) 
[[1, 3, 4, 5], [1, 3, 8], [1, 7, 8], [6, 7, 8], [9]] 
5

प्रत्यावर्तन की तुलना में अधिक कुशल:

result = [] 
while lst: 
    l = lst.pop(0) 
    if type(l[0]) == list: 
     lst += [sublst for sublst in l if sublst] # skip empty lists [] 
    else: 
     result.insert(0, l) 
+3

सूची से पहले आइटम को हटाने, सूची की शुरुआत में डालने से ओ (एन) समय लगता है। ['Collections.deque'] का उपयोग करना (http://docs.python.org/2/library/collections.html#collections.deque) गति को बेहतर बना सकता है। Http://ideone.com/RFGhnh – falsetru

+1

देखें यदि आप दावा करते हैं कि आपका समाधान अन्य समाधानों की तुलना में अधिक कुशल है, तो कृपया छोटे और बड़े इनपुट के लिए मानक संलग्न करें। फाल्सेट्रू की टिप्पणी देखें कि यह धीमा क्यों है। – pts

संबंधित मुद्दे