ホームページ > バックエンド開発 > Python チュートリアル > Pythonのdictionary items()シリーズ関数の使用例

Pythonのdictionary items()シリーズ関数の使用例

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-16 08:42:48
オリジナル
1171 人が閲覧しました

この記事の例では、Python での辞書 items() シリーズ関数の使用法について説明します。これは、Python プログラミングの参考になります。具体的な分析は次のとおりです。

まず例を見てみましょう:

import html  # available only in Python 3.x 
def make_elements(name, value, **attrs): 
  keyvals = [' %s="%s"' % item for item in attrs.items()] 
  attr_str = ''.join(keyvals) 
  element = '<{name}{attrs}>{value}</{name}>'.format( 
      name = name, 
      attrs = attr_str, 
      value = html.escape(value)) 
  return element 
make_elements('item', 'Albatross', size='large', quantity=6) 
make_elements('p', '<spam>') 

ログイン後にコピー

このプログラムの機能は非常に単純で、HTML タグを生成することです。HTML モジュールは Python 3.x でのみ使用できることに注意してください。

タグ属性リストを生成する辞書型変数 keyvals が 2 つの %s が 1 つの項目に対応するという興味深い構成になっていることに今気づきましたので、関連情報を調べてみると、多くのことがわかりました。それらをここにまとめます。

注: 以下のすべての Python インタープリターで使用されるバージョンの場合、2.x は 2.7.3 に対応し、3.x は 3.4.1 に対応します
Python 2.x では、公式ドキュメントの items メソッドは次のとおりです。次のような (キー、値) ペアのリストを生成します:

>>> d = {'size': 'large', 'quantity': 6} 
>>> d.items() 
[('quantity', 6), ('size', 'large')] 

ログイン後にコピー

検索プロセス中に、stackoverflow で次の質問を偶然目にしました: dict.items() と dict.iteritems() の違いは何ですか? 、最初の答えは大まかに次のことを意味します:

「最初は items() は上記のように dict のすべての要素を含むリストを返しましたが、これはメモリの無駄が多すぎるため、後で追加しました (注: iteritems()、iterkeys() は Python 2.2 で登場し始めました) itervalues() はメモリを節約するためにイテレータを返す関数のグループですが、3.x では items() 自体がそのようなイテレータを返すため、3.x の items() の動作は 2.x と同じです。 iteritems() の動作は一貫しており、関数の iteritems() グループは廃止されました。

しかし、さらに興味深いのは、この回答が採用されたにもかかわらず、以下のコメントが 3.x の items() の動作が 2.x の iteritems() とは異なることを指摘していることです。実際に返されるのは「完全なシーケンス プロトコル オブジェクト」で、dict の変更を反映できます。その後、別の関数 viewitems() が Python 2.7 に追加されました。これは 3.x

の動作と一致しています。 コメントの記述を確認するために、テストで使用された Python のバージョンに注意して次のテストを実行しました。

テスト 1 (Python 2.7.3):

Python 2.7.3 (default, Feb 27 2014, 19:58:35)  
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d = {'size': 'large', 'quantity': 6} 
>>> il = d.items() 
>>> it = d.iteritems() 
>>> vi = d.viewitems() 
>>> il 
[('quantity', 6), ('size', 'large')] 
>>> it 
<dictionary-itemiterator object at 0x7fe555159f18> 
>>> vi 
dict_items([('quantity', 6), ('size', 'large')]) 

ログイン後にコピー

テスト 2 (Python 3.4.1):

Python 3.4.1 (default, Aug 12 2014, 16:43:01)  
[GCC 4.9.0] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> d = {'size': 'large', 'quantity': 6} 
>>> il = d.items() 
>>> it = d.iteritems() 
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'iteritems' 
>>> vi = d.viewitems() 
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
AttributeError: 'dict' object has no attribute 'viewitems' 
>>> il 
dict_items([('size', 'large'), ('quantity', 6)]) 

ログイン後にコピー

Python 3.x では、iteritems() と viewitems() の 2 つのメソッドが廃止され、item() によって得られる結果は 2.x の viewitems() と一致していることがわかります。

2.x では、iteritems() および viewitems() によって返されるコンテンツは、次の
のように for を使用して走査できます。

>>> for k, v in it: 
...  print k, v 
...  
quantity 6 
size large 
>>> for k, v in vi: 
...  print k, v 
...  
quantity 6 
size large 

ログイン後にコピー

この 2 つの違いは何ですか? viewitems() は、ディクショナリ内の変更を反映できるビュー オブジェクトを返します。たとえば、上の例では、2 つの変数 it と vi を使用する前にキーと値の組み合わせを d に追加すると、違いが簡単にわかります。 。

>>> it = d.iteritems() 
>>> vi = d.viewitems() 
>>> d['newkey'] = 'newvalue' 
>>> d 
{'newkey': 'newvalue', 'quantity': 6, 'size': 'large'} 
>>> vi 
dict_items([('newkey', 'newvalue'), ('quantity', 6), ('size', 'large')]) 
>>> it 
<dictionary-itemiterator object at 0x7f50ab898f70> 
>>> for k, v in vi: 
...  print k, v 
...  
newkey newvalue 
quantity 6 
size large 
>>> for k, v in it: 
...  print k, v 
...  
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
RuntimeError: dictionary changed size during iteration 

ログイン後にコピー
3 行目で、新しい要素を d に挿入しました。vi はトラバースを続行でき、新しいトラバースは d の変更を反映できますが、トラバース時に辞書を求めるエラー メッセージが表示されます。サイズが変更され、横断は失敗しました。

要約すると、2.x では元々 items() メソッドが使用されていましたが、メモリの無駄が多すぎるため、3.x ではイテレータを返す iteritems() メソッドが追加されました。 ) ビュー オブジェクトを返すように動作が変更され、返されたオブジェクトに元のディクショナリの変更も反映できるようになりました。同時に、viewitems() の下位互換性機能が 2.7 で追加されました。

したがって、3.x では、 items() メソッドが 1 つだけ保持されるため、3 つの違いについて心配する必要はありません。

この記事で説明されている例は、皆さんの Python プログラミングにとって一定の参考になると思います。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート