Pythonでは、2つの異なる種類のイテレータをサポートするクラスを作成しようとしています。おおまかに言えば、このオブジェクトにはデータの行列が含まれています。行の反復と列の反復をサポートするために2種類のイテレータを使用したいと思います。1つのpythonオブジェクトのデュアルイテレータ
答えて
さて、それぞれが発電機である2つの別々の方法を作成してください。
class Matrix(object):
def iter_rows(self):
for row in self.rows:
yield row
def iter_columns(self):
for column in self.columns:
yield column
私はまったく__iter__
を有していないお勧めしますけれどもあなた__iter__
は、デフォルトでは、どちらか一方を反復処理することができます。
これはあなたの探しているものですか?
class Matrix(object):
def __init__(self, rows):
self._rows = rows
def columns(self):
return zip(*self._rows)
def rows(self):
return self._rows
# Create a Matrix by providing rows.
m = Matrix([[1,2,3],
[4,5,6],
[7,8,9]])
# Iterate in row-major order.
for row in m.rows():
for value in row:
print value
# Iterate in column-major order.
for column in m.columns():
for value in column:
print value
あなたはオンデマンドで各列を作成する場合は、itertools.izip
の代わりzip
を使用することができます。
また、実際の値の反復をクラスに移動することもできます。行/列(図のように)を反復したい場合、またはの値がの行/列にあるかどうかはわかりませんでした。
dict
には、いくつかの反復子生成メソッドがあります - iterkeys
、itervalues
、iteritems
- クラスもそうです。 「最も自然な」反復方法が1つある場合は、便宜と可読性のために別名__iter__
に別名を付ける必要があります(iterrows
になるはずですが、当然のことながら、dict
と同じように、反復動作ですが、合理的なピックはnoneより優れています)。
例えば、行列が正方形であり、行優先リストself.data
にフラット化され、一辺がself.n
であるとします。その後:
def iterrows(self):
start = 0
n = self.n
data = self.data
while start < n*n:
stop = start + n
yield data[start:stop]
start = stop
def itercols(self):
start = 0
n = self.n
data = self.data
while start < n:
yield data[start::n]
start += 1
__iter__ = iterrows
iterrowsを実装するために、なぜxrange(0、self.n * self.n、self.n)のstart(self.data [start:start + self.n] –
私はちょうど好都合なときに自分自身を吊り上げるほうが好きです。反復の間に変更するはずがないが、Pythonはその最適化をしません。しかし、効率的に反復する方法は複数ありますが、ここの2つのケースの対称性が好きです。 –
- 1. Python - 2つのリストを1つのjsonオブジェクトに結合する
- 2. 1つのオブジェクトのガベージコレクションC#
- 3. 全体のアプリケーションライフまたはオブジェクト1つにつき1つのオブジェクト+ dispose
- 4. 1つのJavaScript JSONオブジェクト
- 5. Python:2つの別々のオブジェクトを1つに融合させますか?
- 6. python - 2行、1つのコマンド。
- 7. 1つのJFrameに1つ以上のオブジェクトがあります
- 8. 1つのjsonオブジェクトに2つのオブジェクトをレンダリングします
- 9. オブジェクトのオブジェクトを1つのオブジェクトのjavascriptにする
- 10. JavaScriptを - 私は1つのオブジェクトが含ま配列持つオブジェクト
- 11. 複数のjsonオブジェクトをPythonの1つのフォルダパスにダンプします
- 12. jsonオブジェクト内の1つの配列
- 13. 1つのオブジェクト、複数のonclickイベント
- 14. アレイのインデックスを1つのオブジェクトにプッシュ
- 15. PHP多くのオブジェクトが1つのクラス
- 16. オブジェクトのプロパティを1つのリストオブジェクトにマイグレーション
- 17. 1つのファイルに複数のJsonオブジェクトがあるpythonで抽出します
- 18. Python/DjangoのORMフィルターby ManyToMany 1つのオブジェクトが一致する場所
- 19. オブジェクトのプロパティの1つの配列にオブジェクトのリストを変換
- 20. Pythonのウィンドウリバースシェルの1つのライナー
- 21. Python:ディレクトリ内のファイル名を1つ1つチェックする
- 22. Android SearchオブジェクトのArrayListの1つだけ、オブジェクトのインデックスを返す
- 23. 別のオブジェクトから1つのオブジェクトのプロパティにアクセスする
- 24. 1つのオブジェクトのプロパティ値を別のオブジェクトに転送する
- 25. 1つの関連オブジェクトをロードする
- 26. 1つのJupyterノートブック内のRとPython
- 27. Python 1行の2つの関数
- 28. Pythonの1つのライナーelse if文
- 29. 2つのオブジェクトのリストをオブジェクトの1つのリストにマージする方法
- 30. Python:1つのオブジェクトのデータを変更すると、他のオブジェクトが変更されます
matrix'の行のための '書き込む能力は、従って、全く__iter__を有していないよりも何とか__iter__定義した方が良いのPython構文の重要な部分です。 – jfs