আইটেম () এর পরিবর্তে কখন ইটারাইটেম () ব্যবহার করা উচিত?


153

সব জায়গায় items()পরিবর্তে ব্যবহার করা কি বৈধ iteritems()? iteritems()পাইথন 3 থেকে কেন সরানো হয়েছে? এক ভয়ঙ্কর এবং দরকারী পদ্ধতির মত বলে মনে হচ্ছে। এর পিছনে যুক্তি কী?

সম্পাদনা: স্পষ্ট করার জন্য, আমি জানতে চাই যে কোনও জেনারেটরের মতো অভিধানে একটি অভিধানে পুনরাবৃত্তি করার সঠিক আইডিয়ামটি কী (এককালে একটি আইটেম নয়, সমস্ত স্মৃতিতে নয়) পাইথন 2 এবং পাইথন 3 উভয়ের সাথেই সামঞ্জস্যপূর্ণ in ?

উত্তর:


148

পাইথন ২.x - এ .items()(কী, মান) জোড়গুলির একটি তালিকা ফিরে এসেছে। পাইথন 3.x সালে .items()এখন একটি হল itemviewবস্তু, যা বিভিন্ন আচরণ করবে - তাই এটা হয়েছে ধরে iterated করা, অথবা রূপায়িত ... সুতরাং, list(dict.items())কি ছিল প্রয়োজন হয় dict.items()পাইথন 2.x. মধ্যে

পাইথন 2.7 এছাড়াও যে আপনি, কী পরিচালনার জন্য একটি ব্যাক-পোর্টের একটি বিট আছে viewkeys, viewitemsএবং viewvaluesপদ্ধতি, সবচেয়ে দরকারী হচ্ছে viewkeysযা আরো একটি মত আচরণ set(যা আপনি একটি থেকে আশা করতে চাই dict)।

সাধারণ উদাহরণ:

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())

আপনাকে সাধারণ কীগুলির একটি তালিকা দেবে, তবে আবার পাইথন ৩.x- এর .keys()পরিবর্তে কেবল ব্যবহার করুন।

পাইথন 3.x সাধারণত আরো "অলস" হতে করা হয়েছে - অর্থাৎ mapএখন কার্যকরভাবে itertools.imap, zipহয় itertools.izip, ইত্যাদি


96

dict.iteritemsসরানো হয়েছে কারণ dict.itemsএখন জিনিসটি dict.iteritemsপাইথন ২.x এ করেছে এবং এমনকি এটি তৈরি করে কিছুটা উন্নত করেছে itemview


64

ছয়টি গ্রন্থাগার পাইথন কোড লিখতে সহায়তা করে যা পাইথন 2.5+ এবং পাইথন উভয়ের সাথেই সামঞ্জস্যপূর্ণ It এটির একটি ইটারাইটেমস পদ্ধতি রয়েছে যা পাইথন 2 এবং 3 উভয় ক্ষেত্রেই কাজ করবে উদাহরণ:

import six

d = dict( foo=1, bar=2 )

for k, v in six.iteritems(d):
    print(k, v)

9

পাইথন 2 এবং অজগর 3 এর অভিধানের ডকুমেন্টেশনগুলি আপনাকে বলে দেবে, পাইথন 2 এ itemsএকটি তালিকা iteritemsফেরত দেয় , যখন একটি পুনরাবৃত্তি প্রদান করে।

পাইথন 3-এ, itemsএকটি দৃশ্য প্রদান করে , যা অনেকটা পুনরুক্তি হিসাবে একই।

আপনি যদি অজগর 2 ব্যবহার করে থাকেন iteritemsতবে আপনি যদি বৃহত অভিধানের সাথে কথা বলছেন এবং আপনি যা করতে চান তা হ'ল আইটেমগুলিতে পুনরাবৃত্তি করতে হবে (অগত্যা তাদের তালিকায় অনুলিপি করবেন না)


আমি বুঝতে পারি যে iteritemsএটি একটি পুনরাবৃত্তিকারী, যার কারণে এটি এত কার্যকর। আমি প্রায় কোনও তালিকা হিসাবে তালিকা হিসাবে পুনরাবৃত্তি করতে চাই না। সুতরাং পাইথন 2 এবং 3 উভয়ের সাথে সামঞ্জস্যপূর্ণ এমন কোনও জেনারেটরের সাথে অভিধানের মাধ্যমে পুনরাবৃত্তি করার সঠিক উপায় কী?

3
@ ব্যবহারকারী 248237 for key in some_dictউভয় ক্ষেত্রেই কাজ করে - এবং 2to3সরঞ্জামটি iteritems()যে items()কোনও উপায়ে অনুবাদ করবে ...
জন ক্লিমেটস

1
@ জোনক্রিমেন্টস: যথেষ্ট ন্যায্য, যদিও আমি সর্বদা ভেবেছিলাম for k in d: d[k]অপ্রয়োজনীয়ভাবে শব্দচোষী / অব্যক্ত

6

ঠিক যেমন @Wessie উল্লিখিত dict.iteritems, dict.iterkeysএবং dict.itervalues(যা একটি আসতে পুনরুক্তিকারীর Python2.x মধ্যে) ভাল হিসাবে হিসাবে dict.viewitems, dict.viewkeysএবং dict.viewvalues(যা ফেরত দৃশ্য বস্তু Python2.x মধ্যে) সব Python3.x সরানো হয়ে থাকে

আর dict.items, dict.keysএবং dict.valuesএকটি ফিরতি করতে ব্যবহৃত কপি এখন Python2.x মধ্যে অভিধান তালিকায় ফেরত দৃশ্য বস্তু Python3.x এ, কিন্তু তারা এখনও মত নয় পুনরুক্তিকারীর

আপনি যদি পাইথন 3.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'>

বিপরীত অনুসন্ধান করতে চাইলে কোনটি বেশি কার্যকর? বস্তু বা পুনরুক্তি দেখুন?
লাইফবালেন্স

6

আপনি পাইথনের সমস্ত জায়গায় এর itemsপরিবর্তে ব্যবহার করতে পারবেন না iteritems। উদাহরণস্বরূপ, নিম্নলিখিত কোড:

class C:
  def __init__(self, a):
    self.a = a
  def __iter__(self):
    return self.a.iteritems()

>>> c = C(dict(a=1, b=2, c=3))
>>> [v for v in c]
[('a', 1), ('c', 3), ('b', 2)]

আপনি ব্যবহার করলে ব্রেক হবে items:

class D:
  def __init__(self, a):
    self.a = a
  def __iter__(self):
    return self.a.items()

>>> d = D(dict(a=1, b=2, c=3))
>>> [v for v in d]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __iter__ returned non-iterator of type 'list'

পাইথন 3-এ পাওয়া ভিউইটেমগুলির ক্ষেত্রেও এটি একই ।

এছাড়াও, যেহেতু আইটেমগুলি অভিধানের (key, value)জোড়ার তালিকার একটি অনুলিপি প্রদান করে , এটি কম দক্ষ, যদি না আপনি যেভাবে একটি অনুলিপি তৈরি করতে চান।

পাইথন 2 এ, iteritemsপুনরাবৃত্তির জন্য ব্যবহার করা ভাল । 2to3সরঞ্জাম দিয়ে এটি প্রতিস্থাপন করতে পারেন itemsযদি আপনি কখনও পাইথন 3 আপগ্রেড করার সিদ্ধান্ত নেন।


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