2013-08-25 17 views
7

मैं Python3 में map का उपयोग करने का प्रयास कर रहा हूं। यहाँ कुछ कोड मैं का उपयोग कर रहा है:पायथन 3 में मानचित्र का गैर-आलसी मूल्यांकन संस्करण?

import csv 

data = [ 
    [1], 
    [2], 
    [3] 
] 

with open("output.csv", "w") as f: 
    writer = csv.writer(f) 
    map(writer.writerow, data) 

हालांकि, बाद से python3 में map पुनरावर्तक देता है, इस कोड को python3 में काम नहीं करता है (लेकिन map के उस संस्करण के बाद से को Python2 में ठीक काम करता है हमेशा वापसी एक list)

मेरा वर्तमान समाधान मूल्यांकन को मजबूर करने के लिए इटरेटर पर list फ़ंक्शन कॉल जोड़ना है। लेकिन यह अजीब लगता है (मुझे रिटर्न वैल्यू की परवाह नहीं है, मुझे इटरेटर को सूची में क्यों परिवर्तित करना चाहिए?)

कोई बेहतर समाधान?

+3

साइड इफेक्ट्स के लिए 'मैप' का उपयोग करना अजीब बात है। पायथन 2 'मानचित्र' भी वापसी मान एकत्र करता है। नया व्यवहार केवल इसे आगे बढ़ाता है। बस ऐसा मत करो, [लूप के लिए उपयोग करें] (http://stackoverflow.com/q/5753597/395760)। – delnan

+0

@ डेलन लिंक के लिए धन्यवाद, वास्तव में मुझे साइड इफेक्ट के लिए 'मानचित्र' का उपयोग नहीं करना चाहिए। पाइथन 3 के लिए – yegle

+1

, 'सूची (मानचित्र (लैम्ब्डा x: 2 * x, [1,2,3])) ' –

उत्तर

14

map का उपयोग इसके साइड इफेक्ट्स (उदाहरण के लिए फ़ंक्शन कॉल) के लिए करते हुए जब आप लौटाए गए मानों में रुचि नहीं रखते हैं तो Python2.x में भी अवांछनीय है। यदि फ़ंक्शन None देता है, लेकिन दस लाख बार दोहराता है - तो आप इसे छोड़ने के लिए दस लाख None एस की एक सूची तैयार करेंगे। , के रूप में csv मॉड्यूल की अनुमति देता है

for row in data: 
    writer.writerow(row) 

या उपयोग: सही तरीका है या तो एक के लिए लूप का उपयोग करें और कॉल करने के लिए है

writer.writerows(data) 

अगर किसी कारण से आप सच में, सच उपयोग करना चाहता था map, तो आप itertools से consume नुस्खा का उपयोग करें और एक शून्य लंबाई Deque, जैसे उत्पन्न कर सकते हैं:

from collections import deque 
deque(map(writer.writerow, data), maxlen=0) 
2

यदि आपको वापसी मूल्य की परवाह नहीं है, तो map नौकरी के लिए सबसे अच्छा उपकरण नहीं है। एक साधारण for बेहतर होगा:

for d in data: 
    writer.writerow(d) 

कि अजगर 2.x और 3.x. में ठीक काम करेंगे ध्यान दें कि map उपयोगी है जब आप एक नई सूची बनाना चाहते हैं, यदि आप केवल प्रभाव के लिए एक पुनरावृत्त पर जा रहे हैं, तो for का उपयोग करें।

2

आप एक zero length deque यह करने के लिए सेट कर सकते हैं:

with open("output.csv", "w") as f: 
    writer = csv.writer(f) 
    collections.deque(map(writer.writerow, data),0) 

यह उसी तरह है कि itertools.consume (इटरेटर, कोई नहीं) नुस्खा काम करता है। यह कार्यात्मक रूप से सूची बनाने के बिना इटरेटर को समाप्त कर देगा।

आप इटारटोल से consume recipe का भी उपयोग कर सकते हैं।

लेकिन एक लूप मेरे लिए अधिक पठनीय और पायथनिक है, लेकिन वाईएमएमवी।

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