每次附加到列表中时如何添加新行?

时间:2016-12-23 08:03:17

标签: python

任务是在一个列表中创建一个5x5的“O”网格。这是我到目前为止所写的:

board = ["O"]

def lalala(lst):
    new_list = []
    for item in lst:
        new_list.append([item]*5)
    return new_list

print lalala(board)*5

这就是现在的样子:

[['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O']]

如何让它看起来像一个网格,这样的东西(但一切都必须在一个列表中):

[['O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O'], 
 ['O', 'O', 'O', 'O', 'O']]

而不是这样(codecademy不接受这个):

[['O', 'O', 'O', 'O', 'O']]
[['O', 'O', 'O', 'O', 'O']]
[['O', 'O', 'O', 'O', 'O']]
[['O', 'O', 'O', 'O', 'O']]
[['O', 'O', 'O', 'O', 'O']]

Codecademy建议我使用range(),但我不知道这会有什么帮助。

4 个答案:

答案 0 :(得分:2)

如果您创建列表列表,则无法控制之后如何发出换行符。我会逐行控制输出,使用join并人工添加更高级[]

怎么样:

z = lalala(board)
print("["+",\n ".join(str(z) for _ in range(5))+"]")

结果:

[['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O']]

答案 1 :(得分:2)

在某种程度上,您的代码已经正确无误。实际上有一个包含Os的5x5列表。

print语句只显示一行列表。

您可以改为使用 pprint

from pprint import pprint
pprint(board)

答案 2 :(得分:0)

正如其他用户所说,我不相信你可以创建一个打印在多行上的列表。 如果目标只是将行打印为网格而你必须使用range()函数,那么你应该尝试:

list1 = [['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O'], ['O', 'O', 'O', 'O', 'O']]
for y in range(0, len(list1)):
    print list1[y]

显然,这不是解决问题的最有效方法,因为你可以完全不使用range()函数,但这是我看到使用range()函数的唯一方法。

答案 3 :(得分:0)

由于这一行:

new_list = []

您的最终陈述是尝试打印list类型的对象。如何打印对象由它如何转换为字符串定义。这通常由__str__()方法决定,对于像list这样的内置函数,它是不可变的,不能更改为执行其他操作。

为了正确解决您的问题,请定义一个类似于list的类,并在乘以时(您的*5)返回根据需要打印的内容:

board = ["O"]

class Lala:
    def __init__(self, lalala, x):
        self.lalala = lalala
        self.x = x

    def __str__(self):
        res = '['
        for i in range(self.x):
            for l in self.lalala:
                if i != 0:
                    res += ' '
                res += str(l)
                if i != self.x-1:
                    res += ',\n'
        res += ']'
        return res

class Lalala(list):
    def __mul__(self, x):
        return Lala(self, x)


def lalala(lst):
    new_list = Lalala()
    for item in lst:
        new_list.append([item]*5)
    return new_list

print(lalala(board)*5)

这给出了:

[['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O'],
 ['O', 'O', 'O', 'O', 'O']]

根据您对lalala(board)*5的使用情况,您可能还需要定义其他方法(__getitem__等)。