পাইথন 2-তে ডিক্টিমাইটস () এবং ডিক্টিমিটাইটেম () এর মধ্যে পার্থক্য কী?


704

dict.items()এবং এর মধ্যে কোনও প্রয়োগযোগ্য পার্থক্য রয়েছে dict.iteritems()কি?

থেকে পাইথন ডক্স :

dict.items(): অভিধানের (কী, মান) জোড়ার তালিকার একটি অনুলিপি ফিরিয়ে দিন ।

dict.iteritems(): অভিধানের (কী, মান) জোড়গুলির মধ্যে একটি পুনরাবৃত্তি ফেরান

আমি যদি নীচের কোডটি চালিত করি তবে প্রত্যেকে একই বস্তুর রেফারেন্স প্রত্যাবর্তন করবে বলে মনে হচ্ছে। আমি কি অনুপস্থিত কোন সূক্ষ্ম পার্থক্য আছে?

#!/usr/bin/python

d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
   if d[k] is v: print '\tthey are the same object' 
   else: print '\tthey are different'

print 'd.iteritems():'   
for k,v in d.iteritems():
   if d[k] is v: print '\tthey are the same object' 
   else: print '\tthey are different'   

আউটপুট:

d.items():
    they are the same object
    they are the same object
    they are the same object
d.iteritems():
    they are the same object
    they are the same object
    they are the same object

41
এটি কীভাবে গণনা করা হয় তার মধ্যে এটি মূলত একটি পার্থক্য। items()একবারে আইটেমগুলি তৈরি করে এবং একটি তালিকা দেয়। iteritems()একটি জেনারেটর ফেরত দেয় - একটি জেনারেটর এমন একটি বস্তু যা প্রতি সময়ে একবারে একটি আইটেম "তৈরি" করে next()
জোয়েল করনেট

9
আপনার নির্দিষ্ট ক্ষেত্রে, d[k] is vসর্বদা সত্য ফিরে আসবে কারণ পাইথন সমস্ত সংখ্যার জন্য -5 এবং 256 এর মধ্যে পূর্ণসংখ্যার অবজায় রাখে : docs.python.org/2/c-api/int.html আপনি যখন এই পরিসীমাটিতে কোনও int তৈরি করেন আপনি আসলে কেবল বিদ্যমান অবজেক্টের জন্য একটি রেফারেন্স ফিরে পান: >> a = 2; b = 2 >> a is b Trueতবে,>> a = 1234567890; b = 1234567890 >> a is b False
t_tia

3
@ থি_উল্ফ আমার মনে হয় আপনি যে ডকটির বিষয়ে উল্লেখ করছেন তাতে অজগর সংস্করণ যুক্ত করা আরও ভাল হবে be
লরেঞ্জো বেলি 16

2
কি iteritems()পরিবর্তন iter()পাইথন 3? উপরের ডকুমেন্টেশন লিঙ্কটি এই উত্তরের সাথে মিলেছে বলে মনে হচ্ছে না।
গ্যাব্রিয়েল স্টেপলস

3
ঠিক নয়, @ গ্যাব্রিয়েল স্ট্যাপলস। পাইথন 3 অভিধান থেকে ইটারাইটেম () সরানো হয়েছে এবং এর কোনও প্রতিস্থাপন নেই। তবে একই প্রভাবের জন্য আপনি ইটার () ব্যবহার করেন use যেমন ইটার (ডিক্টিমাইটস ())। পিপ 469 দেখুন: পাইথন.অর্গ
জিম

উত্তর:


862

এটি একটি বিবর্তনের অংশ।

মূলত পাইথন items()টিউপসগুলির একটি আসল তালিকা তৈরি করে তা ফিরিয়ে দিয়েছিল। এটি সম্ভাব্যভাবে অতিরিক্ত মেমরি নিতে পারে।

তারপরে, জেনারেটরগুলি সাধারণভাবে ভাষার সাথে পরিচয় করানো হয়েছিল এবং সেই পদ্ধতিটি পুনরায় নামকরণকারী একটি পুনরায় উত্পাদক-জেনারেটর পদ্ধতি হিসাবে ব্যবহার করা হয়েছিল iteritems()। মূল পিছনের সামঞ্জস্যের জন্য রয়ে যায়।

পাইথন 3 এর একটি পরিবর্তন হ'ল items()এখন পুনরুক্তি ফেরত আসে এবং কোনও তালিকা কখনই সম্পূর্ণরূপে তৈরি হয় না। iteritems()পদ্ধতি এছাড়াও চলে গেছে সাল থেকে items()পাইথন 3 কাজ মত viewitems()পাইথন 2.7 হবে।


159
নোট করুন যে আপনি বিবর্তনের কোনও পদক্ষেপ মিস করেছেন: পাই 3 আচরণটি একই রকম নয় iteritems()। এটি আসলে একটি সম্পূর্ণ সিকোয়েন্স-প্রোটোকল অবজেক্ট তৈরি করে যা ডিকের পরিবর্তনগুলিও প্রতিবিম্বিত করে (এবং ডাইন্ডের দ্বারা সমর্থিত, অতিরিক্ত কাজগুলি তালিকার চেয়ে) - এটি ব্যাকপোর্ট করা হয়েছে ২.7 হিসাবে viewitems()
lvc

3
আমি আরও বিস্তারিতভাবে এ সম্পর্কে জানতে চাই, তবে আমার গুগল-ফু আমাকে ব্যর্থ করছে। কেউ কি আমাকে ডকুমেন্টেশন, নিবন্ধ বা উত্সের দিকে নির্দেশ করতে পারেন যা আমাকে এটি আরও ভালভাবে বুঝতে সাহায্য করবে? @lvc?
স্টিউ


1
এই প্রাচীন প্রশ্নের ব্যাখ্যার জন্য দুঃখিত তবে আমি কি সঠিকভাবে বুঝতে পারি যে iteritems()সবসময়items() পাইথন ২.x এর চেয়ে বেশি ভাল ?
রুবেনগের্ট

2
@ রুবেন জিয়ার্ট বেশিরভাগ সময়, এটি কোনও ব্যাপার নয়। সত্যিই বড় dicts জন্য এটি পছন্দনীয় হতে পারে।
কিথ

95

dict.items()2-টিপলস ( [(key, value), (key, value), ...]) এর একটি তালিকা প্রদান করে , যেখানে dict.iteritems()এমন একটি জেনারেটর থাকে যা 2-টিউপলস দেয়। প্রাক্তনটি প্রাথমিকভাবে আরও স্থান এবং সময় নেয় তবে প্রতিটি উপাদান অ্যাক্সেস করা দ্রুত হয়, দ্বিতীয়দিকে প্রাথমিকভাবে কম জায়গা এবং সময় লাগে তবে প্রতিটি উপাদান তৈরিতে কিছুটা বেশি সময় লাগে।


9
আপনি কেন তাদের আলাদা হওয়ার আশা করবেন?
Ignacio Vazquez- আব্রামস

3
দস্তাবেজের "অনুলিপি" এর অর্থ এই নয় যে উপাদানগুলি অনুলিপি করা হয়েছে (যদি আপনি এটি চান, ব্যবহার করুন copy.deepcopy)। এর মানে এটি অভিধানে আইটেম একটি কপি আছে: যদি তুমি করো items = dct.items()এবং তারপর পরিবর্তন dctযোগ / কী মুছে ফেলা বা দ্বারা dct[k] = other_v, itemsএকই থাকতে হবে।
ডগল

4
স্পষ্টভাবে যেমন নথিভুক্ত না করা পাইথনের কোনও কিছুই কখনও গভীর অনুলিপি হয় না।
কার্ল নচেটেল 5'12

1
@ IgnacioVazquez-Abram - "আরও জায়গা এবং সময়" সম্পর্কিত: তারা কোন আকারের অভিধানে বিষয়টি বিবেচনা করতে শুরু করে। বলুন আমি একটি "বৃহত" অভিধান {1:'one', 2:'two', ... }পেয়েছি যার উপর দিয়ে আমি একটি ওয়েবসভারে পুনরাবৃত্তি করতে এবং ফলাফলগুলি রেন্ডার করতে চাই। পাইথন ২.7 এর জন্য .items()বনাম বাছাই করার বিষয়ে কী স্কেলে আমার উদ্বেগ শুরু করা উচিত .iteritems()?
ব্যবহারকারী

1
@ বাফার: আসলেই নিশ্চিত নয়। আমার অনুমান হবে 15-20 আইটেম, কিন্তু আমি এটি পরীক্ষা করিনি।
Ignacio Vazquez-Abram

64

পাই 2.x এ

কমান্ড dict.items(), dict.keys()এবং dict.values()একটি ফিরতি কপি অভিধান এর তালিকা এর (k, v)জোড়া কী ও মান। অনুলিপিযুক্ত তালিকাটি খুব বড় হলে এটি অনেক বেশি স্মৃতি নিতে পারে।

কমান্ড dict.iteritems(), dict.iterkeys()এবং dict.itervalues()একটি আসতে পুনরুক্তিকারীর অভিধান এর উপর (k, v)জোড়া কী ও মান।

কমান্ড dict.viewitems(), dict.viewkeys()এবং dict.viewvalues()আসতে দৃশ্য বস্তু , যা অভিধান এর পরিবর্তনসমূহ প্রতিফলিত করতে পারেন। (উদাহরণস্বরূপ, আপনি যদি delকোনও আইটেম বা অভিধানে একটি (k,v)জুড়ি যোগ করেন , তবে ভিউ অবজেক্ট একই সাথে স্বয়ংক্রিয়ভাবে পরিবর্তন হতে পারে))

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>> 
>>> 
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>> 
>>> 
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

পাই 3.x এ থাকা অবস্থায়

Py3.x, জিনিষ শুধুমাত্র আছে যেহেতু, আরো পরিষ্কার হয় dict.items(), dict.keys()এবং dict.values()পাওয়া যায়, যা আসতে দৃশ্য বস্তু ঠিক যেমন dict.viewitems()মধ্যে Py2.x করেনি।

কিন্তু

ঠিক যেমন @lvc উল্লিখিত দৃশ্য বস্তুর হিসাবে একই নয় পুনরুক্তিকারীর তাই যদি আপনি একটি ফিরতে চাই, পুনরুক্তিকারীর Py3.x, আপনি ব্যবহার করতে পারে iter(dictview):

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>

34

আপনি জিজ্ঞাসা করেছিলেন: 'ডিক.ইটিম () এবং ডিক্টিমাইটেরাইটেম () এর মধ্যে কোনও কার্যকর পার্থক্য রয়েছে কি না'?

এটি সাহায্য করতে পারে (পাইথন ২.x এর জন্য):

>>> d={1:'one',2:'two',3:'three'}
>>> type(d.items())
<type 'list'>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>

আপনি দেখতে পাবেন যে d.items()কী, মান জোড়ার d.iteritems()টিপলগুলির একটি তালিকা প্রদান করে এবং অভিধান-আইটেমিটরেটার ফেরত দেয়।

একটি তালিকা হিসাবে, d.items () স্লাইস-সক্ষম:

>>> l1=d.items()[0]
>>> l1
(1, 'one')   # an unordered value!

তবে কোনও __iter__পদ্ধতি নেই:

>>> next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

কোনো ইটারেটরে হিসেবে d.iteritems () হল না ফালি-সক্ষম:

>>> i1=d.iteritems()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dictionary-itemiterator' object is not subscriptable

তবে আছে __iter__:

>>> next(d.iteritems())
(1, 'one')               # an unordered value!

সুতরাং আইটেমগুলি নিজেরাই একই - আইটেমগুলি সরবরাহ করার ধারকটি আলাদা। একটি হ'ল একটি তালিকা, অন্যটি একটি পুনরুক্তি (পাইথন সংস্করণের উপর নির্ভর করে ...)

সুতরাং ডিক্টিমাইটস () এবং ডিক্টিমাইটারাইটস () এর মধ্যে প্রযোজ্য পার্থক্যগুলি তালিকা এবং একটি পুনরাবৃত্তির মধ্যে প্রযোজ্য পার্থক্যগুলির সমান।


15

dict.items()টিপলগুলির ফিরতি তালিকা, এবং dict.iteritems()অভিধান হিসাবে tuple এর পুনরাবৃত্ত বস্তু প্রদান (key,value)। টিপলগুলি একই, তবে ধারকটি পৃথক।

dict.items()মূলত সমস্ত অভিধানকে তালিকায় অনুলিপি করে। সঞ্চালনের বার তুলনা করতে নিচের কোডটি ব্যবহার করার চেষ্টা করুন dict.items()এবং dict.iteritems()। আপনি পার্থক্য দেখতে পাবেন।

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer() #more memory intensive
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems(): #less memory intensive
    tmp = key + value
t2 = timeit.default_timer() - start

আমার মেশিনে আউটপুট:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

এটি পরিষ্কারভাবে দেখায় যে dictionary.iteritems()এটি আরও বেশি দক্ষ।


4

যদি তোমার থাকে

dict = {key1:value1, key2:value2, key3:value3,...}

ইন পাইথন 2 , dict.items()কপি প্রতিটি tuples এবং আয় অভিধান অর্থাৎ tuples একটি তালিকা [(key1,value1), (key2,value2), ...]। প্রভাবগুলি হ'ল পুরো অভিধানটি টিউপস সমন্বিত নতুন তালিকায় অনুলিপি করা হয়েছে

dict = {i: i * 2 for i in xrange(10000000)}  
# Slow and memory hungry.
for key, value in dict.items():
    print(key,":",value)

dict.iteritems()অভিধান আইটেম পুনরাবৃত্তি প্রদান করে। প্রত্যাবর্তিত আইটেমটির মানও একই অর্থাত্ (key1,value1), (key2,value2), ..., তবে এটি কোনও তালিকা নয়। এটি কেবল অভিধান আইটেম পুনরাবৃত্তকারী অবজেক্ট। এর অর্থ কম স্মৃতি ব্যবহার (50% কম)।

  • পরিবর্তনীয় স্ন্যাপশট হিসাবে তালিকাভুক্ত: d.items() -> list(d.items())
  • আইট্রেটার অবজেক্টস: d.iteritems() -> iter(d.items())

টিপলস একই। আপনি প্রত্যেকের মধ্যে টিপলগুলি তুলনা করেছেন যাতে আপনি একই হন।

dict = {i: i * 2 for i in xrange(10000000)}  
# More memory efficient.
for key, value in dict.iteritems():
    print(key,":",value)

ইন পাইথন 3 , dict.items()আয় বস্তুর iterator। ডিক.মিটারাইটস () সরানো হয়েছে তাই আর কোনও সমস্যা নেই।


3

dict.iteritemsপাইথন 3.x এ চলে গেছে তাই iter(dict.items())একই আউটপুট এবং মেমরির স্বল্পতা পেতে ব্যবহার করুন


1

পাইথন 2 এবং 3 উভয়ের সাথে কাজ করে এমন অভিধানের আইটেম জোড়গুলির পুনরাবৃত্তি করার উপায় আপনি যদি চান তবে এই জাতীয় কিছু চেষ্টা করুন:

DICT_ITER_ITEMS = (lambda d: d.iteritems()) if hasattr(dict, 'iteritems') else (lambda d: iter(d.items()))

এটি এর মতো ব্যবহার করুন:

for key, value in DICT_ITER_ITEMS(myDict):
    # Do something with 'key' and/or 'value'.

0

dict.iteritems(): আপনাকে একটি পুনরাবৃত্তি দেয়। আপনি লুপের বাইরে অন্য নিদর্শনগুলিতে পুনরায় ব্যবহার করতে পারেন।

student = {"name": "Daniel", "student_id": 2222}

for key,value in student.items():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

for key,value in student.iteritems():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

studentIterator = student.iteritems()

print(studentIterator.next())
('student_id', 2222)

print(studentIterator.next())
('name', 'Daniel')

-5

পাইথন 2 এ ডিক্টিমিটেরাইটস () পাইথন 3 তে ডিক্টিমাইটস () এর সমতুল্য।


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