在python中乘以两个列表?

时间:2014-04-06 07:48:29

标签: python list

我正在尝试打印像棋盘一样的列表,我希望它看起来像这样:)

row=1,2,3,4,5,6,7,8 column = a,b,c,d,e,f,g

board=[[1A], [1B], [1C], ......etc.]

有没有办法做到这一点?我还是python的新手。

5 个答案:

答案 0 :(得分:3)

你可以这样做:

row = [1,2,3,4,5,6,7,8]
column = ['a','b','c','d','e','f','g','h']
board = [[str(i)+j.upper() for j in column] for i in row]
>>> print board
['1A', '1B', '1C', '1D', '1E', '1F', '1G', '1H']
['2A', '2B', '2C', '2D', '2E', '2F', '2G', '2H']
...
['8A', '8B', '8C', '8D', '8E', '8F', '8G', '8H']

发生了什么

上面的代码使用双列表理解来创建八个元素的列表,每个列表创建一个行和列的产品,并提供一个二维板。

更简单的可视化

>>> a = ['a','b','c']
>>> b = ['a','b','c']

>>> print [[i+j for j in a] for i in b]

[['aa','ab','ac'],
 ['ba','bb','bc'],
 ['ca','cb','cc']]

答案 1 :(得分:3)

我认为最pythonic的方式是使用itertools标准库,如下所示:

from itertools import product
board = list(product(rows, columns))

这将为您提供一个元组列表,然后您可以按上述海报建议的方式加入(您可能实际上希望将它们保留为元组,为了进一步使用而制作一个字典,例如而不是有字符串你可以用

result = [{'row': r, 'column': c} for r, c in product(rows, columns)]

或者,如果你需要动态做一些事情,你只需要做

for row, column in product(rows, columns):
    # do something for each row colum combination

它明显优于嵌套列表理解,它是一个生成器,因此它的内存效率更高。在你的棋盘情况下,后一个论点并不重要。

答案 2 :(得分:2)

你很可能想要一份清单清单:

board = [['{}{}'.format(row, col) for col in columns] for row in rows]

这会生成一个嵌套的列表列表

>>> rows = [1, 2, 3, 4, 5, 6, 7, 8]
>>> columns = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>>> board = [['{}{}'.format(row, col) for col in columns] for row in rows]
>>> from pprint import pprint
>>> pprint(board)
[['1a', '1b', '1c', '1d', '1e', '1f', '1g', '1h'],
 ['2a', '2b', '2c', '2d', '2e', '2f', '2g', '2h'],
 ['3a', '3b', '3c', '3d', '3e', '3f', '3g', '3h'],
 ['4a', '4b', '4c', '4d', '4e', '4f', '4g', '4h'],
 ['5a', '5b', '5c', '5d', '5e', '5f', '5g', '5h'],
 ['6a', '6b', '6c', '6d', '6e', '6f', '6g', '6h'],
 ['7a', '7b', '7c', '7d', '7e', '7f', '7g', '7h'],
 ['8a', '8b', '8c', '8d', '8e', '8f', '8g', '8h']]

您可以通过以下方式处理单个行:

board[rownumber]

或具体的国际象棋职位:

board[rownumber][columnnumber]

请注意,该列也是的数字!您必须在此处将列名称('a''b'等)翻译为列号:

board[rownumber][ord(columnname) - 97]

会这样做,因为ord('a')(字符'a'的ASCII位置)是97.索引是基于0的;国际象棋职位1a转换为board[0][0]

>>> board[0][0]
'1a'

答案 3 :(得分:1)

您可以使用地图:

 map(lambda x:(map(lambda y:str(x)+y,column)),row)

输出:

[
['1a', '1b', ..],
['2a', '2b', ..],
etc.. 
]

答案 4 :(得分:1)

from itertools import product
row = range(1.9)
column = ['A', 'B', 'C', 'D', 'E', 'F','G', 'H']
board = [['{}{}'.format(*pos)] for pos in product(row,column)]
print board

[[1A], [1B], [1C], ......etc.]

修改

因此product(row, colum)会创建一个一次生成(1,'A'), (1, 'B'), ...,(8, 'G'), (8, 'H')个生成器的生成器。换句话说,它会创建row中的条目与column中每个条目的每个组合。 '{}{}'.format(*pos)使用*将2元组和splats的内容带入format函数。写它的另一种方法是

board = [['{}{}'.format(r,c)] for r,c in product(row,column)]