使用多个参数映射特定函数的最佳pythonic方法

时间:2014-03-17 18:23:29

标签: python for-loop map-function

说我有方法:

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列表需要在str中转换为list3。此外,很难理解发生了什么。是否有更好的pythonic方法用map()zip()或其他方式重写双循环?

注意:更改方法不是一个选项

2 个答案:

答案 0 :(得分: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)]

我确实想要在这里建立一个字典;字典理解可以做到这一点:

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

答案 1 :(得分:1)

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

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

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

最后 note 让我觉得这可能不是OP需要的东西......但它仍然是一个更合适的解决方案来处理这里的一般问题(至少imho)