हर सूची तत्व पर कॉल इंट () फ़ंक्शन?


183

मेरे पास संख्यात्मक स्ट्रिंग के साथ एक सूची है, जैसे:

numbers = ['1', '5', '10', '8'];

मैं हर सूची तत्व को पूर्णांक में परिवर्तित करना चाहूंगा, इसलिए यह इस तरह दिखेगा:

numbers = [1, 5, 10, 8];

मैं इसे एक लूप का उपयोग करके कर सकता था, जैसे:

new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

क्या यह इतना बदसूरत होना है? मुझे यकीन है कि कोड की एक पंक्ति में ऐसा करने के लिए एक और अधिक पायथोनिक तरीका है। कृपया मेरी मदद करें।


1
आप पायथन के किस संस्करण का उपयोग कर रहे हैं?
मार्क बायर्स

जवाबों:



131

पायथन 2.x में एक और दृष्टिकोण का उपयोग करना है map:

numbers = map(int, numbers)

नोट: पायथन 3.x में mapएक मैप ऑब्जेक्ट दिया जाता है जिसे आप चाहें तो एक सूची में बदल सकते हैं:

numbers = list(map(int, numbers))

11
पायथन 3.x में, mapएक सूची के बजाय एक पुनरावृत्तिक लौटाता है, इसलिए इसे लिखने की आवश्यकता है जैसे list(map(int, numbers))कि सूची की आवश्यकता है।
kennytm

2
मुझे लगता है कि वर्तमान में सूची समझ दृष्टिकोण थोड़ा अधिक इष्ट है।
एक्सट्रानोन

3
@ कस्टमरन: हाँ ... या शायद एक सूची के बजाय एक जनरेटर का उपयोग करने पर विचार करें, इस पर निर्भर करता है कि आप इसके लिए क्या उपयोग करेंगे। एक जनरेटर का लाभ यह है कि यदि आपको सभी तत्वों को देखने की आवश्यकता नहीं है, तो आपको उन्हें पहले से गणना करने में समय बर्बाद नहीं करना पड़ेगा।
मार्क बायर्स

4
पायथन 2.7.2 के तहत समय के साथ मापा: LC: 3.578153133392334, मानचित्र: 4.9065070152282715
AJJ

1
@ एजेजे: mapमें उच्च सेटअप ओवरहेड है, लेकिन संदर्भ दुभाषिया पर, यदि ट्रांसफ़ॉर्म फ़ंक्शन सी में कार्यान्वित पायथन में निर्मित फ़ंक्शन है, तो इसकी प्रति आइटम लागत कम है। केवल चार मूल्यों के इनपुट पर परीक्षण स्केलिंग पर उपयोगी जानकारी प्रदान नहीं करेगा। कहा कि, मेरे अपने परीक्षणों में (Py2.7.12 और Py3.5.2 पर, बाद वाले को list()लपेटकर), Py2 के साथ mapचार तत्व इनपुट के लिए भी जीता, और Py3 पर केवल एक छोटे से अंतर से हार जाता है; मुझे संदेह है कि आपके परीक्षण सूचीपत्रों के पक्ष में दिए गए थे।
शैडो रेंजर

21

बस एक बिंदु,

numbers = [int(x) for x in numbers]

सूची की समझ अधिक स्वाभाविक है, जबकि

numbers = map(int, numbers)

ज्यादा तेज़ है।

संभवतः यह ज्यादातर मामलों में मायने नहीं रखेगा

उपयोगी पढ़ें: एलपी बनाम नक्शा


6
क्या यह संख्या = नक्शा (int, संख्या) नहीं होना चाहिए?
करण

9

यदि आप किसी फ़ंक्शन या विधि में उन पूर्णांकों को पास करने का इरादा कर रहे हैं, तो इस उदाहरण पर विचार करें:

sum(int(x) for x in numbers)

यह निर्माण जानबूझकर उल्लेखनीय रूप से adamk द्वारा उल्लिखित सूची समझ के समान है। वर्ग कोष्ठक के बिना, इसे एक जनरेटर अभिव्यक्ति कहा जाता है , और एक विधि के लिए तर्कों की सूची को पारित करने का एक बहुत ही स्मृति-कुशल तरीका है। एक अच्छी चर्चा यहाँ उपलब्ध है: जेनरेटर एक्सप्रेशंस बनाम सूची समझ


4

पायथन 3 में इसे बनाने का दूसरा तरीका:

numbers = [*map(int, numbers)]


1
क्या आप इसे समझा सकते हैं? मैं उस वाक्य रचना से परिचित नहीं हूँ। धन्यवाद!
9

1
मैं खोल तर्क सूची (उपयोग कर रहा हूँ docs.python.org/3/tutorial/... )
zhukovgreen

अहा, एक अजगर 3 बात। []एक तर्क सूची लेने के लिए अजीब लगता है । और, मुझे नहीं पता था कि आप तर्क सूची के रूप में एक पुनरावृत्ति पास कर सकते हैं। मैंने करने का सोचा होगा number = list(map(int, numbers))। लेकिन स्पष्टीकरण के लिए धन्यवाद!
अबल्टर

3

दूसरा रास्ता,

for i, v in enumerate(numbers): numbers[i] = int(v)

6
ओपी कहा pythonic
SilentGhost

3
यह तरीका बहुत उपयोगी है यदि आप सूची में कुछ तत्वों पर केवल संचालन को निष्पादित करना चाहते हैं। यह इस थ्रेड में प्रश्न के लिए प्रासंगिक नहीं है, लेकिन ऐसे मामले हो सकते हैं जब यह मददगार हो
Dikla

1

सोचा था कि मैं जवाबों को मजबूत करूंगा और कुछ timeitपरिणाम दिखाऊंगा ।

पायथन 2 इस पर बहुत बुरा चूसता है, लेकिन mapसमझ से थोड़ा तेज है।

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

पायथन 3 अपने आप में 4x से अधिक तेज है, लेकिन mapजेनरेटर ऑब्जेक्ट को किसी सूची में परिवर्तित करना अभी भी समझ से अधिक तेज है, और mapजनरेटर को अनपैक करके सूची बनाना (धन्यवाद आर्टेम!) अभी भी थोड़ा तेज है।

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

नोट: पायथन 3 में, 4 तत्व क्रॉसओवर पॉइंट (3 पायथन 2 में) प्रतीत होते हैं, जहां समझ थोड़ी तेज है, हालांकि जनरेटर को अनपैक करना अभी भी 1 से अधिक तत्व वाली सूचियों की तुलना में तेज है।

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