पायथन 3.x में सूची वापस करने के लिए मानचित्र () प्राप्त करना


523

मैं एक सूची को हेक्स में मैप करने की कोशिश कर रहा हूं, और फिर सूची का उपयोग कहीं और करूंगा। अजगर 2.6 में, यह आसान था:

एक: अजगर 2.6:

>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']

हालाँकि, पायथन 3.1 में, उपरोक्त एक मैप ऑब्जेक्ट देता है।

बी: अजगर 3.1:

>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>

मैं पायथन 3.x पर मैप की गई सूची ( ए में ऊपर) के रूप में कैसे प्राप्त कर सकता हूं ?

वैकल्पिक रूप से, क्या ऐसा करने का एक बेहतर तरीका है? मेरी प्रारंभिक सूची ऑब्जेक्ट में लगभग 45 आइटम हैं और आईडी उन्हें हेक्स में बदलना पसंद करते हैं।


2
सूची बोध का उपयोग करने के लिए यह अधिक पायथोनिक है । भाषा से लगभग हटा दियाmap() गया था क्योंकि इसका कोई कारण सूची बोध या लूप से अधिक उपयोग नहीं है । for
बोरिस

जवाबों:


771

यह करो:

list(map(chr,[66,53,0,94]))

पायथन 3+ में, पुनरावृत्तियों पर पुनरावृति करने वाली कई प्रक्रियाएँ पुनरावृत्तियों को स्वयं लौटाती हैं। ज्यादातर मामलों में, यह स्मृति को बचाने के लिए समाप्त होता है, और चीजों को तेजी से आगे बढ़ाना चाहिए।

यदि आप सब करने जा रहे हैं, तो अंततः इस सूची पर पुनरावृति हो सकती है, इसे सूची में बदलने की भी आवश्यकता नहीं है, क्योंकि आप अभी भी इस mapतरह वस्तु पर पुनरावृति कर सकते हैं :

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)

15
बेशक, आप इस पर पुनरावृति कर सकते हैं, भी: (chr (x) x के लिए [65,66,67,68] में)। इसके लिए मानचित्र की आवश्यकता भी नहीं है।
हुग्डब्रोर्न

2
@hughdbrown 3.1 का उपयोग करने के लिए तर्क mapएक जटिल कार्य, बड़े डेटा सेट, या धाराओं पर पुनरावृत्ति करते समय आलसी मूल्यांकन होगा।
एंड्रयू केटॉन

18
@ और वास्तव में ह्यू एक जनरेटर की समझ पैदा कर रहा है जो एक ही काम करेगा। वर्ग कोष्ठक के बजाय कोष्ठकों पर ध्यान दें।
ट्रिप्टाइक

5
वैकल्पिक समाधान (बड़े इनपुट के लिए भी तेज़) जब मूल्यों को ASCII / लैटिन -1 के रूप में जाना जाता है तो सी परत पर बल्क रूपांतरण करना होता है: bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')जो कि strथोक रूपांतरण के पक्ष में प्रत्येक तत्व के लिए पायथन फ़ंक्शन कॉल से बचकर एक तेज़ बनाता है केवल C स्तर फ़ंक्शन कॉल का उपयोग करने वाले सभी तत्व। listयदि आप वास्तव listमें व्यक्तिगत पात्रों की जरूरत है , तो आप इसे ऊपर से लपेट सकते हैं , लेकिन चूंकि strयह पहले से ही अपने स्वयं के पात्रों के लिए चलने योग्य है, तो ऐसा करने का एकमात्र कारण यह है कि यदि आपको परिवर्तनशीलता की आवश्यकता है।
शैडो रेंजर

1
सूची (नक्शा (str, [1,2,3])) CentOS 7. सूची बोध कार्यों पर पायथन 3.4.3 के लिए "तर्क में त्रुटि" देता है।
Andor

108

पायथन 3.5 में नया और साफ:

[*map(chr, [66, 53, 0, 94])]

अतिरिक्त अनपैकिंग सामान्यीकरण के लिए धन्यवाद

अपडेट करें

हमेशा छोटे तरीकों की तलाश में, मुझे पता चला कि यह भी काम करता है:

*map(chr, [66, 53, 0, 94]),

ट्यूपल्स में भी अनपैकिंग काम करता है। अंत में अल्पविराम पर ध्यान दें। यह इसे 1 तत्व का टपल बनाता है। यानी यह इसके बराबर है(*map(chr, [66, 53, 0, 94]),)

यह सूची-कोष्ठक के साथ संस्करण से केवल एक चार से छोटा है, लेकिन, मेरी राय में, लिखने के लिए बेहतर है, क्योंकि आप तारांकन के साथ आगे शुरू करते हैं - विस्तार वाक्यविन्यास, इसलिए मुझे लगता है कि यह दिमाग पर नरम है। :)


11
@Quelklef list()साफ
सुथरी

5
@Quelklef: इसके अलावा, अनपैकिंग एप्रोच listसामान्य रूप से तेजी से धन्यवाद है कि कंस्ट्रक्टर को देखने और सामान्य फ़ंक्शन कॉल मशीनरी को लागू करने की आवश्यकता नहीं है । एक लंबे इनपुट के लिए, इससे कोई फर्क नहीं पड़ेगा; थोड़े समय के लिए, यह एक बड़ा बदलाव ला सकता है। इनपुट के साथ उपरोक्त कोड का उपयोग करना tupleताकि यह बार-बार पुनर्निर्मित न हो, ipythonमाइक्रोबेनचर्च दिखाते हैं कि list()रैपिंग दृष्टिकोण अनपैकिंग से लगभग 20% अधिक लंबा होता है। ध्यान रहे, पूर्ण शब्दों में, हम 150 ns के बारे में बात कर रहे हैं, जो कि तुच्छ है, लेकिन आपको यह विचार मिलता है।
शैडो रेंजर

पुराने में क्या गलत था map? हो सकता है कि नए नाम के साथ ( lmap?) यदि नया डिफ़ॉल्ट एक पुनरावृत्तिकर्ता को वापस करना है?
जियोर्जियो

1
*map()पर सिंटेक्स त्रुटि देता है Python 3.6: can't use starred expression here। आपको इसे इसमें डालना होगा list:[ *map() ]
ALH

4
@ALH आप कमांड के अंत में अल्पविराम से चूक गए। बनाने में आसान गलती!
लंदनरोब

103

आप ऐसा क्यों नहीं कर रहे हैं:

[chr(x) for x in [66,53,0,94]]

इसे सूची बोध कहते हैं। आप Google पर बहुत सारी जानकारी पा सकते हैं, लेकिन यहाँ सूची बोध पर पायथन (2.6) प्रलेखन के लिए लिंक है । आप अजगर 3 डोक्यूमिनेशन में अधिक दिलचस्पी ले सकते हैं , हालांकि।


4
Hmmmm। हो सकता है कि लिस्ट कॉम्प्रिहेंशन, जेनरेटर, मैप (), ज़िप (), और अजगर में अन्य तेजी से चलने वाली अच्छाई की एक सामान्य पोस्टिंग हो।
हुग्डब्रोर्न

46
मुझे लगता है क्योंकि यह अधिक क्रियात्मक है, आपको एक अतिरिक्त चर (दो बार) लिखना होगा ... यदि ऑपरेशन अधिक जटिल है और आप एक लंबो लिखते हैं, या आपको कुछ तत्वों को छोड़ने की भी आवश्यकता है, मुझे लगता है कि एक समझ निश्चित रूप से बेहतर है नक्शे + फ़िल्टर की तुलना में, लेकिन यदि आपके पास पहले से ही वह फ़ंक्शन है जिसे आप लागू करना चाहते हैं, तो मानचित्र अधिक रसीला है।
फोरट्रान

1
+1: पढ़ने में आसान और आपको कई मापदंडों के साथ कार्यों का उपयोग करने की अनुमति देता है
Le Droid

7
map(chr, [66,53,0,94])निश्चित रूप से अधिक संक्षिप्त है [chr(x) for x in [66,53,0,94]]
जियोर्जियो

जिस तरह से तेजी से अन्य उत्तर की तुलना में
Evhz

25

लिस्ट-रिटर्निंग मैप फंक्शन में टाइपिंग को बचाने का फायदा है, खासकर इंटरेक्टिव सेशन के दौरान। आप lmapफ़ंक्शन को परिभाषित कर सकते हैं (python2 के सादृश्य पर imap) जो सूची लौटाता है:

lmap = lambda func, *iterable: list(map(func, *iterable))

तब कॉल lmapकरने के बजाय mapकाम करेगा: lmap(str, x)5 वर्णों (इस मामले में 30%) की तुलना में list(map(str, x))कम है और निश्चित रूप से इससे छोटा है [str(v) for v in x]। आप इसी तरह के कार्य filterभी कर सकते हैं ।

मूल प्रश्न के लिए एक टिप्पणी थी:

मैं पायथन 3 में एक सूची वापस करने के लिए मानचित्र () प्राप्त करने के लिए एक नाम सुझाऊंगा। * जैसा कि यह सभी पायथन 3 संस्करणों पर लागू होता है। क्या इसे करने का कोई तरीका है? - मेवोप्लप 24 जनवरी को 17:58 बजे

ऐसा करना संभव है, लेकिन यह बहुत बुरा विचार है। बस मज़े के लिए, यहाँ आप कैसे कर सकते हैं ( लेकिन नहीं करना चाहिए ):

__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator

4

परिवर्तित मेरे पुराने टिप्पणी बेहतर दृश्यता के लिए: एक के लिए बिना "बेहतर तरीका यह है" mapपूरी तरह से, आपके इनपुट ASCII ऑर्डिनल्स माने जाते रहे हैं, यह आम तौर पर ज्यादा परिवर्तित करने के लिए तेजी से करने के लिए bytesऔर डिकोड, एक ला bytes(list_of_ordinals).decode('ascii')। यह आपको strमूल्यों के बारे में बताता है, लेकिन यदि आपको listपरिवर्तनशीलता या इस तरह की आवश्यकता है, तो आप इसे परिवर्तित कर सकते हैं (और यह अभी भी तेज है)। उदाहरण के लिए, ipython45 आदानों को परिवर्तित करने वाले माइक्रोबेनमार्क्स में :

>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

यदि आप इसे एक के रूप में छोड़ देते हैं str, तो यह सबसे तेज़ mapसमाधानों के समय का ~ 20% लेता है ; यहां तक ​​कि वापस सूची में परिवर्तित करना अभी भी सबसे तेज mapसमाधान के 40% से कम है । बल्क के माध्यम से परिवर्तित करें bytesऔर bytes.decodeफिर listबहुत सारे काम को सहेजने के लिए बल्क परिवर्तित करना, लेकिन जैसा कि उल्लेख किया गया है, केवल तभी काम करता है जब आपके सभी इनपुट ASCII अध्यादेश हों (या वर्ण प्रति विशिष्ट लोक एन्कोडिंग प्रति कुछ बाइट में अध्यादेश, जैसे latin-1)।


2
list(map(chr, [66, 53, 0, 94]))

नक्शा (दुर्गंध, * पुनरावृत्तियां) -> मानचित्र वस्तु एक पुनरावृत्तक बनाएं जो प्रत्येक पुनरावृत्तियों में से तर्कों का उपयोग करके फ़ंक्शन की गणना करता है। जब सबसे कम चलने योग्य समाप्त हो जाता है तो रुक जाता है।

"एक पुनरावृत्ती बनाओ"

इसका मतलब है कि यह एक पुनरावृत्ती लौटाएगा।

"जो प्रत्येक पुनरावृत्तियों से तर्कों का उपयोग करके फ़ंक्शन की गणना करता है"

इसका अर्थ है कि पुनरावृत्त का अगला () फ़ंक्शन प्रत्येक पुनरावृत्तियों का एक मान लेगा और उनमें से प्रत्येक को फ़ंक्शन के एक स्थितीय पैरामीटर में पास करेगा।

तो आपको नक्शे से एक इटरेटर मिलता है () फ़नक्शन और jsut इसे लिस्ट () बिलिन फंक्शन या लिस्ट एक्सपट्र्स का इस्तेमाल करते हैं।


2

में ऊपर जवाब के अलावा Python 3, हम बस एक बना सकते हैं listपरिणाम मूल्यों की एक से mapके रूप में

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

हम एक और उदाहरण द्वारा सामान्य कर सकते हैं जहां मुझे मारा गया था, मानचित्र पर संचालन को भी इसी तरह के फैशन में regexसमस्या में संभाला जा सकता है, हम listएक ही समय में मानचित्र पर आइटम प्राप्त करने और परिणाम प्राप्त करने के लिए फ़ंक्शन लिख सकते हैं । पूर्व।

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]

@miradulo मैं पायथन 2 में माना गया था, एक सूची वापस आ गई थी, लेकिन पायथन 3 में, केवल टाइप लौटा है और मैंने सिर्फ उसी प्रारूप में देने की कोशिश की है। अगर आपको लगता है कि इसकी जरूरत है, तो शायद मेरे जैसे लोग हैं जो इसे उपयोगी पा सकते हैं और यही वजह है कि मैंने इसे जोड़ा।
हैरी_पीबी

2
जब पहले से ही एक सूची समझ, एक सूची समारोह, और एक अनपैकिंग उत्तर होता है, तो लूप के लिए स्पष्ट रूप से बहुत IMHO नहीं जोड़ा जाता है।
मिरदुलो

1

आप ऑब्जेक्ट में प्रत्येक आइटम की पुनरावृति करके मानचित्र ऑब्जेक्ट से एक सूची प्राप्त करने का प्रयास कर सकते हैं और इसे एक अलग चर में संग्रहीत कर सकते हैं।

a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']

0

अजगर और बुनियादी मानचित्र फ़ंक्शन उपयोगिता में सूची समझ का उपयोग करना, कोई भी यह कर सकता है:

chi = [x for x in map(chr,[66,53,0,94])]


ची लिस्ट होगी, दिए गए तत्वों की ASIC वैल्यू।
दर्शन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.