[] এবং}} বনাম তালিকা () এবং ডিক (), যা আরও ভাল?


113

আমি বুঝতে পারি যে এগুলি উভয়ই মূলত একই জিনিস, তবে শৈলীর দিক থেকে, কোন খালি তালিকা বা ডিক তৈরি করতে আরও ভাল (আরও পাইথোনিক) ব্যবহার করা উচিত?

উত্তর:


197

গতির দিক দিয়ে, এটি খালি তালিকা / জালিয়াতির জন্য কোনও প্রতিযোগিতা নয়:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

এবং খালি নয়:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267

এছাড়াও, বন্ধনী স্বরলিপি ব্যবহার করে আপনি তালিকা এবং অভিধান বোঝার জন্য ব্যবহার করতে পারবেন যা যথেষ্ট কারণ হতে পারে।


4
পাশাপাশি ইংরেজি নাম ব্যবহার করে ডিক্ট এবং লিস্টের বোঝাপড়াও করা যেতে পারে। উদাহরণ:list(i for i in range(10) if i % 2)
জাগস

4
a} এবং [] এত দ্রুত হওয়ার কারণ আছে কি? আমি ভেবেছিলাম তারা কেবলমাত্র উপাধি ছিল।
জাস্টিন ডি

সময়টি সঠিক সময় দেবে বলে মনে হয় না। মাপদণ্ড অনুসারে, এটি 200 ডলার লাগবে যা স্বাভাবিক HTTP কলগুলির চেয়ে ধীর। সাধারণত শেলের মধ্যে ডিক () চালানোর চেষ্টা করুন এবং তারপরে টাইমিট ("ডিক ()") চালানোর চেষ্টা করুন, আপনি মৃত্যুদন্ড কার্যকর করার ক্ষেত্রে দৃশ্যমান পার্থক্য দেখতে পাবেন।
পিয়ুশ

2
@ পিয়ুশ আসলে, timeit()ফাংশনটি নির্দিষ্ট পরিমাণ পুনরাবৃত্তি সম্পাদন করতে মোট সময়ের পরিমাণ রিপোর্ট করে যা 1000000ডিফল্টরূপে। সুতরাং উপরের উদাহরণগুলি হ'ল এক মিলিয়ন বার স্নিপেট কোড চালানোর জন্য সেকেন্ডের সংখ্যা। উদাহরণস্বরূপ timeit('dict()', number=1) // -> 4.0531158447265625e-06(একটি পুনরাবৃত্তি) যখন timeit('dict()') // -> 0.12412905693054199(এক মিলিয়ন পুনরাবৃত্তি)
গ্রেগ হাসকিনস

@ গ্রেগহাসকিনস তাই সেক্ষেত্রে আমি লক্ষ করি না যে ডিক () বা about using ব্যবহারের বিষয়ে কারও উদ্বেগ হওয়া উচিত, যদি না মিলিয়ন রেকর্ডের মধ্য দিয়ে লুপে ডুপ (ডুপ) ব্যবহার করে।
পিয়ুশ

37

আমার মতে []এবং {}খালি তালিকা / ডিস্ক তৈরির সর্বাধিক পাইথোনিক এবং পঠনযোগ্য উপায় are

set()যদিও সতর্ক থাকুন , উদাহরণস্বরূপ:

this_set = {5}
some_other_set = {}

বিভ্রান্তিকর হতে পারে। প্রথম এক উপাদান সঙ্গে একটি সেট তৈরি করে, দ্বিতীয় একটি খালি অভি এবং সৃষ্টি না একটি সেট।


4
{}সর্বদা একটি খালি ডিক তৈরি করে। {1,2,3}২.7+ এ একটি সেট তৈরি করে তবে এটি 2.6পুরানো সংস্করণে একটি বাক্য গঠন ত্রুটি ।
চোরমাস্টার

1
দুঃখিত? এটি নামের সাথে একটি ভেরিয়েবল যা some_epic_setখালি dictবস্তুটির দিকে নির্দেশ করছে ... এটি কোনও খালি সেট নয়। একটি খালি সেট জন্য আপনার ব্যবহার করা প্রয়োজন set()
6502

2
@ 6502: আসলে, তবে এটি একটি সাধারণ ক্ষতি {5}যা একটি উপাদান দিয়ে একটি সেট তৈরি করে 5এবং {}এটি খালি ডিক্ট।
orlp

1
বাহ, এটা বিভ্রান্তিকর ছিল। তবুও, এটি বিভ্রান্তির খারাপ ডিজাইন স্তরের ফ্র্যাক্টাল নয়। :-)
অধ্যাপক ফ্যালকেন

4
@ ইন্ডারলুক: প্রকৃতপক্ষে সাধারণ আনপ্যাকিংয়ের মাধ্যমে আপনি আক্ষরিক বাক্য গঠন দিয়ে {*()}খালি তৈরি করতে ব্যবহার করতে পারেন set। আমি একে একচক্ষু বানর অপারেটর বলি। :-)
শ্যাডোর্যাঞ্জার

17

অভি আক্ষরিক একটি হতে পারে অতি ক্ষুদ্র বিট দ্রুততর তার বাইটকোড খাটো:

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

একই ক্ষেত্রে প্রযোজ্য listবনাম[]


8
এটি ধরে নিয়েছে যে BUILD_MAP এবং LOAD_GLOBAL ধ্রুবক সময় এবং একই পরিমাণ সময় নেয়। অত্যন্ত সম্ভাবনা নেই। সময়কাল আরও ভাল অনুমান দেয়।
জেমি পেট

সম্ভবত, কমপক্ষে যতটা সময় CALL_FUNCTIONলাগে (ফাংশনটি মূলত বলা হয় ) এবং এটি অতিরিক্ত অতিরিক্ত ওভারহেড নেয়। BUILD_MAPBUILD_MAPLOAD_GLOBAL
চিপনার

3

আইএমএইচও, ব্যবহার করে list()এবং dict()আপনার পাইথনকে সি উগের মতো দেখায়।


3

[] এবং তালিকার () এর মধ্যে পার্থক্যের ক্ষেত্রে, এমন একটি সমস্যা রয়েছে যা আমি অন্য কাউকে দেখায়নি। আপনি যদি তালিকার সদস্য হিসাবে অভিধান ব্যবহার করেন তবে দু'জন সম্পূর্ণ ভিন্ন ফলাফল দেবে:

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 

আপনি [foo_dict]ব্যবহার করে একই ফলাফল পেতে পারেন list((foo_dict,))list()পদ্ধতি হিসাবে এটি শুধুমাত্র পরামিতি এবং iterates এটা লিস্টে উপাদান যোগ করার জন্য শেষ একটি iterable লাগে। এটি লিখিতভাবে list(some_list)সমতল করে দেবে যা করে একই ধরণের ক্ষতি ঘটবে।
sotrh

1

তালিকা () এবং [] আলাদাভাবে কাজ করুন:

>>> def a(p=None):
...     print(id(p))
... 
>>> for r in range(3):
...     a([])
... 
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
...     a(list())
... 
139969725367296
139969725367552
139969725367616

তালিকা () সর্বদা স্তূপে নতুন অবজেক্ট তৈরি করে তবে []] অনেক কারণেই মেমরি সেল পুনরায় ব্যবহার করতে পারে।


0

নীচে শো হিসাবে উদাহরণ হিসাবে [] এবং তালিকার () এর মধ্যে আচরণের মধ্যে একটি পার্থক্য রয়েছে। আমাদের যদি সংখ্যার তালিকা ফেরত দিতে চান তবে আমাদের তালিকা ব্যবহার করতে হবে, অন্যথায় আমরা একটি মানচিত্রের অবজেক্টটি পাই! যদিও এটি ব্যাখ্যা করবেন তা নিশ্চিত নয়।

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int

এখানে পরিসীমা () ফাংশন >>> মুদ্রণ (পরিসর (10)) # পরিসীমা (0, 10) পরিসর () একটি তালিকার মতো আচরণ করে বলে আচরণের ব্যাখ্যা বলে মনে হচ্ছে, তবে এটি কোনও তালিকা নয়। এটি এমন একটি বস্তু যা ক্রম থেকে ক্রমাগত আইটেমগুলি ফেরত দেয় যখন আপনি এটির পুনরাবৃত্তি করেন, স্থানটি সাশ্রয় করে, এটি সত্যিই তালিকা তৈরি করে না। যেমন একটি বস্তু পুনরাবৃত্তিযোগ্য, এটি, ফাংশন এবং কনস্ট্রাক্টসের লক্ষ্য হিসাবে উপযুক্ত যা এমন কিছু প্রত্যাশা করে যার থেকে তারা সরবরাহ শেষ না হওয়া অবধি ধারাবাহিক আইটেমগুলি অর্জন করতে পারে। ফাংশন তালিকা () পুনরাবৃত্ত থেকে তালিকা তৈরি করে: >>> তালিকা (পরিসর (5)) # [0, 1, 2, 3, 4]
সেবট্যাক

1
পরিণতি হ'ল [] পুনরাবৃত্তিযোগ্য বস্তু সঞ্চয় করে; তালিকা () একই পুনরাবৃত্ত থেকে তালিকা তৈরি করে
সেপ্টটেক

0

একটি বক্স ব্রাকেট জুটি তালিকার কোনও একটি বা একটি সূচক সাবস্ক্রিপ্ট, মাই_লিস্ট [এক্স] উল্লেখ করে।

একটি কোঁকড়া ধনুর্বন্ধনী জোড় একটি অভিধান অবজেক্টকে বোঝায়।

a_list = ['চালু', 'বন্ধ', 1, 2]

a_dict = {অন: 1, বন্ধ: 2


-5

এটি বেশিরভাগ সময় প্রধানত পছন্দ করার বিষয়। এটা পছন্দসই বিষয়।

তবে খেয়াল করুন যে উদাহরণস্বরূপ যদি আপনার সংখ্যার কীগুলি থাকে তবে আপনি এটি করতে পারবেন না:

mydict = dict(1="foo", 2="bar")

তোমাকে করতে হবে:

mydict = {"1":"foo", "2":"bar"}

7
এটি ভুল ... আপনাকে mydict = {1:"foo", 2:"bar"}(কীগুলির জন্য উদ্ধৃতিবিহীন) করতে হবে।
6502

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