1

メソッドがあるとします:

def add_force_coupling(g1, g2, name):
    print {(g1,g2): name}

次にコード:

l = 3
for g1 in range(l):
    for g2 in range(l):
      name = 'G' + str(g1) + str(g2)
      add_force_coupling(g1, g2, name)

結果を生成します:

{(0, 0): 'G00'}, {(0, 1): 'G01'}, {(0, 2): 'G02'}, {(1, 0): 'G10'}, ..., {(2, 2): 'G22'}

関数を使用して、これをより Pythonic にしたいと思いmap()ます。これまでのところ、私は持っています:

list1 = sorted(l*range(l))
list2 = l*range(l)
list3 = ["".join(values) for values in zip(l*l*'G',list(map(str,l1)),list(map(str,l2)))]
map( add_force_coupling, list1, list2, list3 )

これはまさに私が望むことを行いますが、 int リストをstrinに変換する必要があるため、標準の二重ループよりも醜いですlist3。また、何が起こっているのかを理解することは非常に困難です。map()、またはその他の方法で二重ループを書き換えるより良いpythonicの方法はありzip()ますか?

注: メソッドの変更はオプションではありません

4

2 に答える 2

5

使用しないでくださいmap()。リスト内包表記と を使用しますitertools.product()

from itertools import product

[{(i, j): 'G{}{}'.format(i, j)} for i, j in product(range(l), repeat=2)]

または、左側の式に関数を使用します。

[add_force_coupling(i, j, 'G{}{}'.format(i, j))
 for i, j in product(range(l), repeat=2)]

ここで1 つの辞書を作成しようとしていることに驚きました。辞書内包表記はそれを行うことができます:

{(i, j): 'G{}{}'.format(i, j) for i, j in product(range(l), repeat=2)}

ここでは、各項目を で指定できますresult[i, j]

しかし、インデックスが与えられた場合、ネストされたリストはデータのより効率的なストレージ メカニズムになります。

[['G{}{}'.format(i, j) for j in range(l)] for i in range(l)]

そして結果に対処する

result[i][j]
于 2014-03-17T18:25:14.100 に答える
1

マップや辞書を使用しないでください。これは自然に 2 次元リストとして表されます。

data = [['G{0}{1}'.format(j,i) for i in range(l)] for j in range(l)]

data[0][0]
print data[0][1] 
...

うーん、最後のメモは、これはおそらくOPが必要とするものではないことを私に伝えます...しかし、それはまだここでの一般的な問題に対するより適切な解決策です(少なくともimho)

于 2014-03-17T18:30:54.743 に答える