2

我使用以下方法生成了一个列表列表:

board = []
for i in range(0,5):
    board.append(["#"] * 4)

返回:

 [['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

并使用此功能将它们打印在单独的行上:

def print_board(board):
for row in board:
    print row

哪个输出:

['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

我正在寻找某种方法,允许我编辑“板”列表中的项目,将字符串添加到“板”中的项目,但不改变已经是“板”中项目的子列表。

例如, board[0].function('A') 将使 'board' 返回如下内容:

[['#', '#', '#', '#'] A, ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

print_board 函数将返回:

['#', '#', '#', '#'] A
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

我想我的问题的一个浓缩版本是:是否有一个函数可以将字符串添加到列表中的项目,这些项目本身就是列表,或者这只是不可能的语法?

谢谢您的帮助。

4

4 回答 4

2

您可以将其用作生成矩阵的更简单方法:

>>> LoL=[['#']*4 for i in range(5)]
>>> LoL
[['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

并使用 .insert 将元素添加到给定位置的列表中:

>>> LoL.insert(1,'A')
>>> LoL
[['#', '#', '#', '#'], 'A', ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#'], ['#', '#', '#', '#']]

问题可能在于混合类型。您可以通过使用更多级别的列表来解决此问题:

>>> LoL=[[['#']*4] for i in range(5)]
>>> LoL
[[['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']]]

然后你可以使用追加而不是插入:

>>> LoL[0].append('A')
>>> LoL
[[['#', '#', '#', '#'], 'A'], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']], [['#', '#', '#', '#']]]

然后更容易打印,因为列表是同质的:

>>> print '\n'.join(str(i)[1:-1] for i in LoL)
['#', '#', '#', '#'], 'A'
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

您还可以对每一行使用字典:

>>> d={i:l for i,l in enumerate(LoL)}   #assuming that is just a LoL
>>> d
{0: [['#', '#', '#', '#']], 1: [['#', '#', '#', '#']], 2: [['#', '#', '#', '#']], 3: [['#', '#', '#', '#']], 4: [['#', '#', '#', '#']]}
>>> d[0].append('A')
>>> d
{0: [['#', '#', '#', '#'], 'A'], 1: [['#', '#', '#', '#']], 2: [['#', '#', '#', '#']], 3: [['#', '#', '#', '#']], 4: [['#', '#', '#', '#']]}
>>> d[0]
[['#', '#', '#', '#'], 'A']

然后通过对字典的键进行排序来打印:

>>> print '\n'.join(str(d[k])[1:-1] for k,v in sorted(d.items()) )
['#', '#', '#', '#'], 'A'
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']

编辑

你可以这样打印:

>>> for row in LoL:
...    for items in row:
...        print items,
...    print
... 
['#', '#', '#', '#'] A
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
['#', '#', '#', '#']
于 2013-04-06T22:54:19.527 回答
1

创建一个新类,如下所示:

class Row(list):
    def __init__(self, *args, **kw):
        list.__init__(self, *args, **kw)
        self._str = ''

    def add(self, value):
        self._str += value

    def __str__(self):
        return list.__str__(self) + ' ' + self._str

board = []
for i in range(0,5):
    board.append(Row(["#"] * 4))

def print_board(board):
    for row in board:
        print row

board[0].add('A')

print_board(board)
于 2013-04-06T22:57:34.027 回答
0

您是否尝试将项目附加到列表中的列表?也许你可以尝试类似

list[1].append("string")

并将 1 替换为大列表中列表的位置。或者也许用一个列表分配一个新变量并将该变量附加到一个列表中,这样会更容易和更直接。

对不起,如果我不明白你的问题。我不是以英语为母语的人。

于 2013-04-06T22:57:07.240 回答
0

您可以将任何您想要的内容添加到列表中,并根据需要在其中组合项目,但是在上面的示例中,字符串“A”以某种方式浮动在那里并不是列表的一部分,因此语法没有意义.

如果您想要做的只是以某种方式使行可以动态增长,您可以将列表放在列表中(代表一行),这样您就可以将项目(任何类型)添加到这样的行中:

board = [
[['#', '#', '#', '#'], 'A'],
[['#', '#', '#', '#']]
[['#', '#', '#', '#']]
[['#', '#', '#', '#']]
[['#', '#', '#', '#']]]

要访问第一行并添加“A”,您只需执行以下操作:board[0].append('A')

我希望这回答了你的问题。

于 2013-04-06T23:07:43.340 回答