প্রতিটি তালিকার উপাদানগুলিতে ইন্ট ইন () ফাংশন কল করবেন?


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

পাইথন ২.x এ অন্য পদ্ধতির ব্যবহারটি হল map:

numbers = map(int, numbers)

দ্রষ্টব্য: পাইথন x.x এ mapএকটি মানচিত্রের অবজেক্ট ফেরত দেয় যা আপনি চাইলে তালিকায় রূপান্তর করতে পারেন:

numbers = list(map(int, numbers))

11
পাইথন ৩.x-এ, mapতালিকার পরিবর্তে একটি পুনরাবৃত্তি প্রদান করে, সুতরাং এটি লিখিত প্রয়োজন যেমন list(map(int, numbers))একটি তালিকা প্রয়োজন।
কেনেটিএম

2
আমি মনে করি বর্তমানে তালিকা বোধগম্যতাটি কিছুটা বেশি পছন্দসই।
এক্সেরেনন

3
@ এক্সট্রেনন: হ্যাঁ ... বা সম্ভবত আপনি কোনটির জন্য ব্যবহার করবেন তার উপর নির্ভর করে কোনও তালিকার পরিবর্তে জেনারেটর ব্যবহারের বিষয়টি বিবেচনা করুন। একটি জেনারেটরের সুবিধা হ'ল যদি আপনাকে সমস্ত উপাদানগুলির দিকে নজর দেওয়ার প্রয়োজন না হয় তবে আপনাকে সেগুলি আগে থেকে গণনায় সময় নষ্ট করতে হবে না।
মার্ক বাইয়ার্স

4
পাইথন ২.7.২ এর অধীনে টাইমিট সহ পরিমাপ করা হয়েছে: এলসি: 3.578153133392334, মানচিত্র: 4.9065070152282715
এজেজে

1
@ এজেজে: mapওভারহেডের উচ্চতর সেটআপ রয়েছে, তবে রেফারেন্স ইন্টারপ্রেটারের উপর, যদি ট্রান্সফর্ম ফাংশনটি সিটিতে প্রয়োগ করা পাইথন অন্তর্নির্মিত ফাংশন হয় তবে এতে প্রতি আইটেম ব্যয় কম হয়। মাত্র চারটি মানের একটি ইনপুট পরীক্ষা করা স্কেলিং সম্পর্কিত দরকারী তথ্য সরবরাহ করবে না। এটি বলেছিল, আমার নিজের পরীক্ষায় (পাই ২..1.১২ এবং পাই ৩.২.২, মোড়কের সাহায্যে পরবর্তী list()), পাই 2 mapএমনকি চারটি উপাদান ইনপুট জিতেছে এবং পাই 3-তে কেবল একটি ছোট ব্যবধানে হেরেছে; আমি সন্দেহ করি যে আপনার পরীক্ষাগুলি লিস্টকম্পের পক্ষে সজ্জিত ছিল।
শ্যাডোর্যাঞ্জার

21

শুধু একটি পয়েন্ট,

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

তালিকা বোধগম্যতা আরও প্রাকৃতিক, যখন

numbers = map(int, numbers)

দ্রুততর.

সম্ভবত এটি বেশিরভাগ ক্ষেত্রে গুরুত্বপূর্ণ হবে না

দরকারী পড়া: এলপি বনাম মানচিত্র


6
এটি সংখ্যা = মানচিত্র (int, সংখ্যা) হওয়া উচিত নয়?
করণ

9

আপনি যদি কোনও ক্রিয়াকলাপ বা পদ্ধতিতে সেই পূর্ণসংখ্যার পাস করার পরিকল্পনা করে থাকেন তবে এই উদাহরণটি বিবেচনা করুন:

sum(int(x) for x in numbers)

এই নির্মাণটি ইচ্ছাকৃতভাবে অ্যাডাম্যাক দ্বারা উল্লিখিত তালিকা বোঝার সাথে উল্লেখযোগ্য। বর্গাকার বন্ধনী ব্যতীত এটিকে জেনারেটর এক্সপ্রেশন বলা হয় এবং এটি কোনও পদ্ধতিতে আর্গুমেন্টের একটি তালিকা পাস করার একটি খুব স্মৃতি-দক্ষ উপায়। একটি ভাল আলোচনা এখানে পাওয়া যায়: জেনারেটর এক্সপ্রেশন বনাম তালিকা সংক্ষেপণ


4

পাইথন 3 এ এটির আরও একটি উপায়:

numbers = [*map(int, numbers)]


1
আপনি এই ব্যাখ্যা করতে পারেন? আমি এই সিনট্যাক্সের সাথে পরিচিত নই। ধন্যবাদ!
আবাল্টার

1
আমি আনপ্যাকিং আর্গুমেন্টের তালিকাটি ব্যবহার করছি ( ডকস.পিথন.আর / 3 / টিউটোরিয়াল/… )
zhukovgreen

আহা, অজগর 3 জিনিস। []আর্গুমেন্টের তালিকাটি নেওয়া অদ্ভুত বলে মনে হচ্ছে । এবং, আমি জানতাম না আপনি কোনও আউট্রেটারকে আর্গুমেন্টের তালিকা হিসাবে পাস করতে পারবেন। আমি ভাবতে হবে number = list(map(int, numbers))। তবে ব্যাখ্যার জন্য ধন্যবাদ!
অবল্টার

3

অন্য উপায়,

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

6
ওপি বলেছেন pythonic
SilentGhost

3
এই তালিকাটি খুব কার্যকর যদি আপনি কেবল তালিকার কিছু উপাদানগুলিতে অপারেশন চালাতে চান। এটি এই থ্রেডের প্রশ্নের জন্য প্রাসঙ্গিক নয় তবে এটি কার্যকর হতে পারে এমন ক্ষেত্রেও হতে পারে
ডিকলা

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জেনারেটরটি আনপ্যাক করে তালিকা তৈরি করা (ধন্যবাদ আর্টেম!) এখনও কিছুটা দ্রুত is

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 টি উপাদান ক্রসওভার পয়েন্ট বলে মনে হচ্ছে (পাইথন 2-এ 3) যেখানে বোধগম্যতা কিছুটা দ্রুত, যদিও জেনারেটরটি প্যাক করা এখনও 1 টিরও বেশি উপাদানগুলির তালিকাগুলির তুলনায় দ্রুত still

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.