আমি বিভিন্ন ধরণের দৈর্ঘ্যের তালিকা তৈরি করতে চাই। প্রতিটি তালিকায় একই উপাদান e
, বারবার n
বার (যেখানে n
= তালিকার দৈর্ঘ্য) থাকবে।
[e for number in xrange(n)]
প্রতিটি তালিকার জন্য কোনও তালিকা উপলব্ধি না করে আমি কীভাবে তালিকা তৈরি করব ?
আমি বিভিন্ন ধরণের দৈর্ঘ্যের তালিকা তৈরি করতে চাই। প্রতিটি তালিকায় একই উপাদান e
, বারবার n
বার (যেখানে n
= তালিকার দৈর্ঘ্য) থাকবে।
[e for number in xrange(n)]
প্রতিটি তালিকার জন্য কোনও তালিকা উপলব্ধি না করে আমি কীভাবে তালিকা তৈরি করব ?
উত্তর:
আপনি এটিও লিখতে পারেন:
[e] * n
আপনার অবশ্যই লক্ষ্য করা উচিত যে e উদাহরণস্বরূপ যদি খালি তালিকা হয় তবে আপনি একই তালিকাতে n রেফারেন্স সহ একটি তালিকা পাবেন, n খালি খালি তালিকা নয়।
পারফরম্যান্স টেস্টিং
প্রথম নজরে মনে হয় পুনরাবৃত্তি হ'ল এন অভিন্ন উপাদানগুলির সাথে তালিকা তৈরির দ্রুততম উপায়:
>>> timeit.timeit('itertools.repeat(0, 10)', 'import itertools', number = 1000000)
0.37095273281943264
>>> timeit.timeit('[0] * 10', 'import itertools', number = 1000000)
0.5577236771712819
তবে অপেক্ষা করুন - এটি একটি সুষ্ঠু পরীক্ষা নয় ...
>>> itertools.repeat(0, 10)
repeat(0, 10) # Not a list!!!
ফাংশনটি itertools.repeat
আসলে তালিকা তৈরি করে না, এটি কেবল এমন একটি অবজেক্ট তৈরি করে যা আপনার ইচ্ছামত তালিকা তৈরি করতে ব্যবহৃত হতে পারে! আসুন এটি আবার চেষ্টা করুন, তবে একটি তালিকায় রূপান্তর করুন:
>>> timeit.timeit('list(itertools.repeat(0, 10))', 'import itertools', number = 1000000)
1.7508119747063233
সুতরাং আপনি যদি একটি তালিকা চান, ব্যবহার করুন [e] * n
। আপনি যদি অলসভাবে উপাদানগুলি তৈরি করতে চান তবে ব্যবহার করুন repeat
।
[[]] * n
অপ্রত্যাশিত ফলাফল আনতে পারে। অনন্য শূন্য উপ-তালিকা তৈরি করতে , বোধগম্যতার জন্য ব্যবহার করুন:[[] for i in range(0,n)]
পাইথনে এক বার পুনরাবৃত্তি করা একক আইটেমের তালিকা তৈরি করুন
অপরিবর্তনীয় আইটেমগুলির জন্য যেমন কোনও নয়, বুলস, ইনসেটস, ফ্লোটস, স্ট্রিংস, টিপলস বা হিমশৈলীর জন্য আপনি এটি এটি করতে পারেন:
[e] * 4
নোট করুন যে এটিকে কেবল তালিকায় অপরিবর্তনীয় আইটেম (স্ট্রিং, টিপলস, ফ্রোজেনসেটস) দিয়ে সেরা ব্যবহার করা হয়, কারণ তারা সকলেই স্মৃতিতে একই জায়গায় একই আইটেমটির দিকে নির্দেশ করে। যখন আমি সমস্ত স্ট্রিংয়ের স্কিমা সহ একটি টেবিল তৈরি করতে পারি তখন আমি এটি ঘন ঘন ব্যবহার করি, যাতে আমাকে একটি ম্যাপিংয়ের জন্য অত্যধিক অতিরিক্ত রিডান্ট্যান্ট দিতে না হয়।
schema = ['string'] * len(columns)
আমি পাইথনকে এখন দীর্ঘকাল ব্যবহার করেছি এবং আমি এমন কোনও ব্যবহারের ক্ষেত্রে দেখিনি যেখানে আমি উপরোক্তরূপে উদাহরণস্বরূপ উপরের কাজটি করব। পরিবর্তে, বলুন, একটি পরিবর্তনীয় খালি তালিকা, সেট, বা ডিক, আপনার এই জাতীয় কিছু করা উচিত:
list_of_lists = [[] for _ in columns]
আন্ডারস্কোরটি এই প্রসঙ্গে কেবল একটি বহনযোগ্য পরিবর্তনশীল নাম name
আপনার যদি কেবল সংখ্যাটি থাকে তবে তা হ'ল:
list_of_lists = [[] for _ in range(4)]
_
সত্যিই বিশেষ নয়, কিন্তু আপনার কোডিং পরিবেশ শৈলী পরীক্ষক সম্ভবত অভিযোগ যদি আপনি ভেরিয়েবল ব্যবহার এবং অন্য কোন নাম ব্যবহার করতে চাই না হবে।
পরিবর্তনীয় অবজেক্টের সাথে এই কাজটি সম্পর্কে সতর্ক থাকুন , আপনি যখন তাদের মধ্যে একটি পরিবর্তন করেন, সেগুলি সমস্ত পরিবর্তিত হয় কারণ তারা সমস্ত একই বস্তু:
foo = [[]] * 4
foo[0].append('x')
foo এখন ফিরে:
[['x'], ['x'], ['x'], ['x']]
তবে অপরিবর্তনীয় বস্তুর সাহায্যে আপনি এটিকে কাজ করতে পারেন কারণ আপনি রেফারেন্স পরিবর্তন করেছেন, বস্তুটি নয়:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
তবে আবার, পরিবর্তনযোগ্য বস্তুগুলি এর পক্ষে ভাল নয়, কারণ স্থানস্থ ক্রিয়াকলাপগুলি বস্তুটিকে পরিবর্তন করে, রেফারেন্সটি নয়:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]
Itertools এর জন্য একটি ফাংশন রয়েছে:
import itertools
it = itertools.repeat(e,n)
অবশ্যই itertools
আপনাকে তালিকার পরিবর্তে একটি পুনরাবৃত্তি দেয়। [e] * n
আপনাকে একটি তালিকা দেয় তবে এই সিকোয়েন্সগুলির সাথে আপনি কী করবেন তার উপর নির্ভর করে itertools
বৈকল্পিকটি আরও কার্যকর হতে পারে।
অন্যরা যেমন উল্লেখ করেছে, * অপারেটরটিকে একটি পরিবর্তনীয় অবজেক্টের সদৃশ রেফারেন্সগুলির জন্য ব্যবহার করে, সুতরাং আপনি যদি কোনও পরিবর্তন করেন তবে আপনি সেগুলি সমস্ত পরিবর্তন করেন। আপনি যদি কোনও মিউটরেবল অবজেক্টের স্বতন্ত্র উদাহরণ তৈরি করতে চান তবে আপনার এক্সরেঞ্জ সিনট্যাক্সটি এটি করার সবচেয়ে পাইথোনিক উপায়। আপনি যদি এমন নামযুক্ত ভেরিয়েবল ব্যবহার করে বিরক্ত হন যা কখনও ব্যবহৃত হয় না, আপনি বেনামে আন্ডারস্কোর ভেরিয়েবলটি ব্যবহার করতে পারেন।
[e for _ in xrange(n)]
[e] * n
কাজ করা উচিত