2010-09-25 9 views
11

में सूची की एक सूची है, लेकिन कोई नहीं के इस कोड वापसी सूची को पलट नहीं सकते (मुझे लगता है कि यह क्योंकि list.reverse() जगह में सूची विपरीत हो रहा है है):मैं क्यों मैं इस तरह कुछ करना चाहता था अजगर

map(lambda row: row.reverse(), figure) 

मैं इस एक कोशिश की, लेकिन उलट पुनरावर्तक वापसी:

map(reversed, figure) 

अंत में मैं कुछ इस तरह है, जो काम किया है मेरे लिए, लेकिन मैं अगर यह सही समाधान नहीं जानता:

def reverse(row): 
    """func that reverse a list not in place""" 
    row.reverse() 
    return row 

map(reverse, figure) 

मुझे पता है अगर किसी को एक बेहतर समाधान है कि मैं तो कृपया के बारे में पता नहीं कर रहा हूँ है

तरह सादर,

उत्तर

8

तुम भी एक टुकड़ा का उपयोग कर सकते एक भी का प्रत्यावर्तन पाने के लिए सूची (जगह में नहीं):

>>> a = [1,2,3,4] 
>>> a[::-1] 
[4, 3, 2, 1] 

तो कुछ की तरह:

all_reversed = [lst[::-1] for lst in figure] 

... या ...

all_reversed = map(lambda x: x[::-1], figure) 

... तुम क्या चाहते हो जाएगा।

27

mutator (जैसे सूचियों का .reverse पद्धति के रूप में) पायथन के परिवर्तनशील कंटेनरों के तरीकों लगभग हमेशा लौट None - कुछ वापसी एक उपयोगी मान, उदा .pop विधि पॉप किए गए तत्व को लौटाती है, लेकिन बनाए रखने की मुख्य अवधारणा यह है कि उनमें से कोई भी उत्परिवर्तक उत्परिवर्तित कंटेनर वापस नहीं देता है: बल्कि कंटेनर जगह पर परिवर्तित करता है और म्यूटेटर विधि का वापसी मान कंटेनर नहीं है। (यह CQS डिज़ाइन के सिद्धांत का एक अनुप्रयोग है - जैसा कि कहते हैं, एफ़िल में, बर्ट्रेंड मेयर द्वारा बनाई गई भाषा, जिसने सीक्यूएस का आविष्कार किया है, लेकिन ऐसा इसलिए है क्योंकि पाइथन में "व्यावहारिकता शुद्धता को धड़कता है, सीएफआर import this; । -)

एक सूची का निर्माण अक्सर बस घने मामले ऐसे सभी आप क्या करना चाहते परिणाम पर पाश है के लिए, पुनरावर्तक के निर्माण की तुलना में महंगे है, इसलिए बनाया-इन जैसे reversed (और सभी itertools मॉड्यूल में अद्भुत बिल्डिंग ब्लॉक) रीटर इटरेटर्स, सूचियां नहीं।

लेकिन यदि आपके पास n iterator x लेकिन वास्तव में वास्तव में समतुल्य सूचीy की आवश्यकता है? केक का टुकड़ा - बस y = list(x) करें। list टाइप करने का एक नया उदाहरण बनाने के लिए, आप कॉल टाइप list टाइप करें - यह एक सामान्य पायथन विचार है कि पहले दो अनुच्छेदों में मैंने उल्लेख की गई महत्वपूर्ण चीज़ों की तुलना में बनाए रखने के लिए और भी महत्वपूर्ण है!-)

तो, अपने विशिष्ट समस्या के लिए कोड वास्तव में बहुत एक साथ पिछले पैराग्राफ में महत्वपूर्ण विचार के आधार पर डाल करने के लिए आसान है:

[list(reversed(row)) for row in figure] 

ध्यान दें कि मैं एक सूची समझ का उपयोग कर रहा हूँ, नहींmap: एक सामान्य नियम के रूप में, map केवल जब वहाँ कोई एक lambda इसे बनाने के लिए (अगर एक lambda बाद हमेशा की तरह साफ होने के रूप में एक listcomp शामिल है, साथ ही साथ के लिए की जरूरत एक आखिरी अनुकूलन के रूप में इस्तेमाल किया जाना चाहिए , वैसे भी तेज़ हो जाता है! -)।

एक बार जब आप एक "अजगर के पिछले मास्टर" कर रहे हैं, यदि आपका रूपरेखा आपको बताता है कि इस कोड को एक टोंटी है, तो आप इस तरह के

[row[::-1] for row in figure] 

एक नकारात्मक कदम टुकड़ा करने की क्रिया लागू करने के रूप विकल्प की कोशिश करने का पता कर सकते हैं (उर्फ "मार्टियन स्माइली") पंक्तियों की उलटी प्रतियां बनाने के लिए, यह जानते हुए कि यह list(reversed(row)) दृष्टिकोण से आमतौर पर तेज़ है। लेकिन - जब तक आपका कोड केवल आपके द्वारा या किसी व्यक्ति द्वारा पाइथन में कम से कम कुशलता से बनाए रखने के लिए नहीं है - यह सबसे सरल "पहले सिद्धांतों से कोड" दृष्टिकोण का उपयोग करने के लिए एक रक्षात्मक स्थिति है, सिवाय इसके कि प्रोफाइलिंग आपको पेडल पर धक्का देने के लिए कहती है । (व्यक्तिगत रूप से मुझे लगता है कि "मार्टियन स्माइली" इस विशिष्ट सामान्य मामले के लिए इस सामान्य सामान्य दर्शन को लागू करने से बचने के लिए पर्याप्त महत्वपूर्ण है, लेकिन, हे, उचित लोग इस विशिष्ट बिंदु पर भिन्न हो सकते हैं! -)।

+0

व्यक्तिगत पूर्वाग्रह पर काबू पाने के लिए +1 :: - 1 – intuited

+3

+1 "मार्टियन स्माइली" के लिए +1 –

0

तुम भी बस

for row in figure: 
    row.reverse() 

जगह में प्रत्येक पंक्ति को बदलने के लिए कर सकते हैं।