मैं एक समस्या है जहाँ मैं बार के कई अरबों आवर्ती की संभावना रही थी मिलता है, और जिस तरह से मैंने किया था पुनरावृत्ति द्वारा flattening द्वारा। मुझे नहीं पता कि इस विधि को पहले दस्तावेज किया गया है, क्योंकि मैं इसे खोजने के बजाय अपने साथ आया था। आपको बस इतना करना है कि प्रत्येक फंक्शन के स्थानीय नामस्थान को सूची में रखा जाए। यदि कोई वर्कअराउंड नहीं है, तो इसके लिए आपके वास्तविक कोड में बदलाव की आवश्यकता होगी। यहाँ यह कैसे काम करता है:
def flatten_a_list(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0]
flattened = []
for item in obj:
if type(item) == list:
flattened.append(flatten_a_list(item))
else:
flattened.append(item)
return flattened
अब, यह पारंपरिक रूप से पुनरावर्ती है:
मैं इस कार्य हो कहो। इसे बनाने के लिए इतना है कि यह हालांकि कई nestings वहाँ कोई सीमा नहीं साथ कर रहे हैं के लिए काम करेंगे, मैं इस करना होगा:
from copy import deepcopy
def improved(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0]
flattened = []
position = [0]
while True:
print('position: {}'.format(str(position)))
x = deepcopy(obj)
try:
for index in position:
x = x[index]
except (IndexError, TypeError):
break
if type(x) == list:
position.append(0)
print('continuing')
continue
else:
flattened.append(x)
#Test the next position
test = deepcopy(position)
test[-1] += 1
x = deepcopy(test)
print('x: {}'.format(x))
try:
y = deepcopy(obj)
for index in x:
y = y[index]
position = deepcopy(test)
except (IndexError, TypeError):
position = position[:-1]
try:
position[-1] += 1
except IndexError:
break
return flattened
दो शब्द: मन झुकने
समारोह मैं काम करता है ठीक लिखा था, लेकिन यह unoptimized है। यदि आप गति चाहते हैं, तो पहले सुनिश्चित करें कि आप फ़ंक्शन को समझते हैं, फिर कोड के 'एक्स' और 'वाई' ब्लॉक ले कर इंडेक्स ओवरफ्लो की जांच को गठबंधन करते हैं।
आपको इसे अपने कोड में अनुकूलित करना होगा, लेकिन जब तक आप इसे समझते हैं, यह बहुत अधिक या समस्या नहीं होनी चाहिए। इसके अलावा, जवाब पार मंच और असीमित है।
यह एक [पायथन सीमा] (http://stackoverflow.com/a/6809586/3872894) हो सकता है, मैक के साथ कुछ नहीं करना। –
क्या आपने रैखिक स्टैक विकास की बजाय लॉग स्टैक वृद्धि के लिए अपने रिकर्सन को फिर से लिखने की संभावना पर विचार किया है? उदाहरण के लिए, अधिकतम सूची को अधिकतम सूची की तुलना में अधिकतम सूची की तुलना करके रिक्त रूप से स्थापित किया जा सकता है, लेकिन स्टैक सूची के आकार में रैखिक रूप से बढ़ेगा। एक बेहतर समाधान सूची के पहले भाग के अधिकतम भाग और सूची के दूसरे भाग को अधिकतम करना है, और उन दोनों में से बड़ा लेना, जो कम काम नहीं करता है लेकिन सूची के आकार में लॉकथिदमिक रूप से स्टैक बढ़ाता है । शायद आपकी समस्या को समान रूप से दोहराया जा सकता है। – pjs
दिलचस्प @pjs, क्या आपके पास इसका मौका है? – Goodies