2013-04-01 19 views
5

私はタイルの説明を含むxmlファイルからボードゲーム用のタイルのリストを作成しようとしています。 xmlファイルには、各タイルタイプと、そのタイプのタイル数が記述されています。Pythonの2番目のリストからオブジェクトの複数のインスタンスを持つ単一のリストを作成する

はこれまでのところ、私は正確に一つの各タイルタイプのでリストを作成し、次のコードを持っている:

[Tile(el.id) for el in <tile descriptions>] 

を私は、例えば、各タイルの適切な数のリストを作成したいのですがこのような何か:

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

これを行うには、エレガントなワンライナーがあり、または私は各タイルの種類のためのリストを作成し、連結することで、それを長い手を行うために必要なのですか?

+0

言い換えれば、返されるリストの要素自体が、それぞれ長さ 'el.n_tiles'のリストになりますか?もしそうなら、NPEの答えを考えてください。 – jedwards

答えて

3

方法について:、代わりに

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

内側のリストの内包表記を使用します:

[Tile(el.id) for el in <tile descriptions> for _ in range(el.n_tiles)] 
+0

それはトリックでした。ありがとう! – Stefan

3

あなたが投稿したコードは同じ内側のリストを複数回繰り返すことになります

[[Tile(el.id) for i in range(<el.n_tiles>)] for el in <tile descriptions>] 

連結された単一のリストを作成することを目標とする場合は、 nにループネストされたとのリストの内包を使用します。

[Tile(el.id) for el in <tile descriptions> for i in range(<el.n_tiles>)] 

もう少し高度たら、同じ効果(リスト平坦化)itertools.chain.from_iterableを用いて達成することができます。

これが役に立ちます。ハッピーゲーム:-)

+0

ありがとうございます。私はこの仕事をすることができませんでした... "rレンジ"はタイプミスですか? "r"がなければ走りましたが、私はまだそれを動作させるために苦労しました。内部のリスト内包語:-)を読み上げます。 – Stefan

+0

はい、それはタイプミスでした。今修正されました:-) –

+0

ありがとうございます。 2番目の例で同じtypo ...コピー&ペーストエラー? – Stefan

関連する問題