2013-12-11 1 views
5

चेतावनी: इस कोड-गोल्फ के लिए एक सीधे ऊपर सवाल है, तो मुझे पता है कि मैं क्या पूछ रहा हूँ उत्पादन में बुरा व्यवहार हैएक सूची समझ दौरान संलग्न का उपयोग कर एक सूची में फेरबदल

मैं परिवर्तन करने के लिए कोशिश कर रहा हूँ एक सूची समझ के दौरान एक सरणी, लेकिन किसी कारण से यह लटक रहा है और मुझे नहीं पता कि इसे क्यों ठीक किया जाए या कैसे।

मैं अनिश्चित गहराई की सूचियों की एक सूची से निपट रहा हूं और उन्हें एक फ्लैट सूची में घनत्व की आवश्यकता है - for those curious its this question। लेकिन इस स्तर पर, बस कहें कि मुझे सूची में सभी तत्वों की एक विस्तृत सूची की आवश्यकता है, और 0 यदि यह एक सूची है।

for o in x: 
if type(o)==type([]):x+=o 
else:i+=o 
print i 

मैं इस सूची समझ का उपयोग कर तो जैसे छोटा करने के लिए, कोशिश कर रहा हूँ:

सामान्य विधि सूची के माध्यम से पुनरावृति करने के लिए और अगर इसकी एक सूची अंत में जोड़ने, तो तरह है।

print sum([ 
[o,x.append(o) or 0][type(o)==type([])] 
for o in x 
])) 

अब, मैं List.append रिटर्न नहीं पता है, कि मैं एक अंकीय मान पाने इतना सुनिश्चित करने के लिए, मैं आलसी मूल्यांकन x.append(o) or 0 कर सकते हैं कहते हैं, और के बाद से None "falsy" है यह दूसरे भाग evaulate जाएगा और मूल्य है 0

लेकिन ऐसा नहीं है। अगर मैंने x.append() को x पर सूची समझ में डाल दिया है, तो यह तोड़ता है या त्रुटि नहीं करता है, या पुनरावृत्ति त्रुटि देता है, यह बस जम जाता है। सूची समझ के दौरान append फ्रीज क्यों करता है, लेकिन ऊपर for लूप ठीक काम करता है?

संपादित करें: हटाया जा रहा से इस सवाल रखने के लिए, मैं गोल्फ टिप्स के लिए नहीं देख रहा हूँ (वे हालांकि बहुत शैक्षिक कर रहे हैं), मैं क्यों कोड मैं के रूप में काम कर रहा था के रूप में एक जवाब के लिए देख रहा था इसे लिखा था

+0

इस प्रश्न के लिए ऑफ-विषय, लेकिन मूल समस्या के लिए: क्या यह नेस्टेड में घोंसला वाले पुनरावर्तनीय को फ़्लैट करने के लिए आसान नहीं होगा (जिसे आप 3.3+ में 2-लाइन फ़ंक्शन में कर सकते हैं, एक 3-लाइन फ़ंक्शन बिना, यदि आप 'अधिक-itertools'' जैसे तृतीय-पक्ष मॉड्यूल का उपयोग नहीं कर सकते हैं, तो बस उस इटरेटर पर छोटा कोड लिखें? – abarnert

+0

@barnert 'itertools आयात से *' 22 वर्ण लंबा है, तो आपको वास्तविक विधि को कॉल करने की आवश्यकता है। लाइब्रेरी के लिए भुगतान करने के लिए काफी कीमत है। –

+0

'योग (मानचित्र (लैम्ब्डा x: x% 2-.5, flatten (ए))) 'केवल 37 वर्ण हैं। 22 + 1 + 37 = 60, जो निश्चित रूप से 73 है जो अब वहां है। – abarnert

उत्तर

8

or आलसी हो सकता है, लेकिन सूची परिभाषाएं नहीं हैं। x में प्रत्येक o, जब [o,x.append(o) or 0][type(o)==type([])] कुरूपता मूल्यांकन किया जाता है के लिए, अजगर [o,x.append(o) or 0] मूल्यांकन करने के लिए, x.append(o) or 0, जिसका अर्थ है कि o यह एक सूची है, चाहे x से जोड़ दिए जाएंगे का मूल्यांकन जिसका मतलब है कि है। इस प्रकार, आप x के साथ जोड़ दिया x के प्रत्येक तत्व के साथ खत्म हो, और उसके बाद वे फिर से संलग्न और बार-बार और OutOfMemoryError

+0

मुझे त्रुटि देखने के लिए काफी देर तक इंतजार नहीं करना चाहिए था। ड्राइंग बोर्ड मुझे लगता है :( –

+1

@LegoStormtroopr: यदि आप 6 पर हैं 4-बिट पायथन, एक मंच पर जो आवश्यकतानुसार स्वैप फैलता है (ओएस एक्स और विंडोज दोनों डिफ़ॉल्ट रूप से करते हैं), त्रुटि स्वैप थ्रैशिंग के घंटों के बाद तक नहीं हो सकती है ... – abarnert

3

के बारे में क्या मिलता है: होगा

y = [element for element in x if type(element) != list or x.extend(element)] 

(ध्यान दें कि extend समतल है, जबकि append केवल नेस्टेड सूची को अंत में वापस जोड़ें, unflattened)।

+2

क्यों न केवल टाइप करें (तत्व)! = सूची '? 'सूची' * *' [] 'का प्रकार है। – mgilson

+0

अहम, ठीक है! मैं @ लेगो के कोड को बदल रहा था और हवा के साथ ले गया :) धन्यवाद! सही किया! – Roberto

+0

शानदार गोल्फिंग, लेकिन यह वास्तव में सवाल का जवाब नहीं देता है। हालांकि, मैं अच्छी चेतना में इसे चुनौती पर अपने स्वयं के समाधान के रूप में प्रस्तुत नहीं कर सका और सुझाव देता हूं कि आप इसके बजाय ऐसा करें। –

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