Python,切片列表?

时间:2014-12-20 12:16:35

标签: python list slice

我真的需要你帮助切片。

让我说我有一个这样的列表列表:

field=[[1, 2, 4, 4], [4, 1, 4, 2], [2, 1, 4, 3], [2, 4, 2, 3], [1, 2, 3, 4]]

我必须编写一个函数,它将返回一个如下所示的字符串:

42334
44423
21142
14221

因此胖我设法做到了:

def out(field):
    b=''
    for list in field:
        list1=list[::-1]
        b+=''.join((str(sth) for sth in list1))+'\n'
    return b

返回:

4421
2414
3412
3242
4321

2 个答案:

答案 0 :(得分:3)

您需要将行列表转置到列列表中,并反转转置结果以获得正确的旋转。

zip(*field)将行转置为列reversed(),然后反转结果。结合列表理解,您可以在一个表达式中执行此操作:

def out(field):
    return '\n'.join([''.join(map(str, c)) for c in reversed(list(zip(*field)))])

或拼写成显式循环:

def out(field):
    b = []
    for columns in reversed(list(zip(*field))):
        b.append(''.join(map(str, columns)))
    return '\n'.join(b)

围绕list()调用的zip()调用允许我们在Python 3中反转迭代器结果;它可以在Python 2中删除。

演示:

>>> field=[[1, 2, 4, 4], [4, 1, 4, 2], [2, 1, 4, 3], [2, 4, 2, 3], [1, 2, 3, 4]]
>>> [''.join(map(str, c)) for c in reversed(list(zip(*field)))]
['42334', '44423', '21142', '14221']
>>> '\n'.join([''.join(map(str, c)) for c in reversed(list(zip(*field)))])
'42334\n44423\n21142\n14221'
>>> print('\n'.join([''.join(map(str, c)) for c in reversed(list(zip(*field)))]))
42334
44423
21142
14221

答案 1 :(得分:0)

def out(field):
    b=''
    a=[]
    while len(field[0])>0:
        for list in field:
            a.append(list.pop())
        a.append("\n")
    a="".join(str(x) for x in a)
    return a 
x=[[1, 2, 4, 4], [4, 1, 4, 2], [2, 1, 4, 3], [2, 4, 2, 3], [1, 2, 3, 4]]
print out(x)