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'}

现在我想通过使用这个map()函数来使它更加pythonic。到目前为止,我得到了:

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。也很难理解发生了什么。有没有更好的 pythonic 方式用 a 或其他方式重写双map()循环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)]

你想在这里建立本字典确实让我感到震惊;一个 dict 理解可以做到这一点:

{(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

不要使用地图或字典,这自然表示为二维列表

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 需要的......但它仍然是这里一般问题的更合适的解决方案(至少恕我直言)

于 2014-03-17T18:30:54.743 回答