এক বার আইটেম এন বার পুনরাবৃত্তি তালিকা তৈরি করুন


522

আমি বিভিন্ন ধরণের দৈর্ঘ্যের তালিকা তৈরি করতে চাই। প্রতিটি তালিকায় একই উপাদান e, বারবার nবার (যেখানে n= তালিকার দৈর্ঘ্য) থাকবে।

[e for number in xrange(n)]প্রতিটি তালিকার জন্য কোনও তালিকা উপলব্ধি না করে আমি কীভাবে তালিকা তৈরি করব ?

উত্তর:


776

আপনি এটিও লিখতে পারেন:

[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


23
অভিন্ন উপাদানগুলির সাথে একটি তালিকা তৈরির কার্যকারিতা পাইথন প্রোগ্রামের পারফরম্যান্সের একটি গুরুত্বপূর্ণ উপাদান হয়ে উঠবে এটি অত্যন্ত সম্ভাবনা নয়।
আর্থার

11
উপরে উল্লিখিত হিসাবে, ই যদি একটি খালি তালিকা [[]] * nঅপ্রত্যাশিত ফলাফল আনতে পারে। অনন্য শূন্য উপ-তালিকা তৈরি করতে , বোধগম্যতার জন্য ব্যবহার করুন:[[] for i in range(0,n)]
জোশিয়াহ যোডার

149
>>> [5] * 4
[5, 5, 5, 5]

আইটেমটি পুনরাবৃত্তি হওয়ার সময় সতর্কতা অবলম্বন করুন। তালিকাটি ক্লোন করা হবে না: সমস্ত উপাদান একই তালিকাতে উল্লেখ করবে!

>>> x=[5]
>>> y=[x] * 4
>>> y
[[5], [5], [5], [5]]
>>> y[0][0] = 6
>>> y
[[6], [6], [6], [6]]

80

পাইথনে এক বার পুনরাবৃত্তি করা একক আইটেমের তালিকা তৈরি করুন

অপরিবর্তনীয় আইটেম

অপরিবর্তনীয় আইটেমগুলির জন্য যেমন কোনও নয়, বুলস, ইনসেটস, ফ্লোটস, স্ট্রিংস, টিপলস বা হিমশৈলীর জন্য আপনি এটি এটি করতে পারেন:

[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'])]

26

Itertools এর জন্য একটি ফাংশন রয়েছে:

import itertools
it = itertools.repeat(e,n)

অবশ্যই itertoolsআপনাকে তালিকার পরিবর্তে একটি পুনরাবৃত্তি দেয়। [e] * nআপনাকে একটি তালিকা দেয় তবে এই সিকোয়েন্সগুলির সাথে আপনি কী করবেন তার উপর নির্ভর করে itertoolsবৈকল্পিকটি আরও কার্যকর হতে পারে।


12

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

[e for _ in xrange(n)]

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