通常,你想要反过来,like here。我想知道你如何将一个平面列表转换为一个列表,在python中的quasy重塑数组
在numpy中你可以做类似的事情:
>>> a=numpy.aranage(9)
>>> a.reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
我想知道你是如何做相反的事情,我通常的解决方案是:
>>> Mylist
['a', 'b', 'c', 'd', 'e', 'f']
>>> newList = []
for i in range(0,len(Mylist),2):
... newList.append(Mylist[i], Mylist[i+1])
>>> newList
[['a', 'b'], ['c', 'd'], ['e', 'f']]
有更多的“Pythonic”方式吗?
答案 0 :(得分:33)
>>> l = ['a', 'b', 'c', 'd', 'e', 'f']
>>> zip(*[iter(l)]*2)
[('a', 'b'), ('c', 'd'), ('e', 'f')]
正如@Lattyware所指出的,这只有在每次返回元组时zip
函数的每个参数中都有足够的项时才有效。如果其中一个参数的项目少于其他参数,则会切断项目,例如
>>> l = ['a', 'b', 'c', 'd', 'e', 'f','g']
>>> zip(*[iter(l)]*2)
[('a', 'b'), ('c', 'd'), ('e', 'f')]
如果是这种情况,那么最好使用@Sven Marnach的解决方案
答案 1 :(得分:13)
def grouper(n, iterable, fillvalue=None):
"grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
示例:
>>> my_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> list(grouper(2, my_list))
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', None)]
答案 2 :(得分:8)
创建列表列表的另一种方法可以简化如下:
>>>MyList = ['a','b','c','d','e','f']
# Calculate desired row/col
>>>row = 3
>>>col = 2
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)]
>>>NewList
[['a', 'b', 'c'], ['d', 'e', 'f']]
这种方法可以扩展为产生任何行和列大小。如果您选择row*col >len(MyList)
的行和列值,则MyList
中包含最后一个值的子列表(行)将在那里结束,而NewList
将只填充适当的空数列表以满足行/列规范
>>>MyList = ['a','b','c','d','e','f','g','h']
>>>row = 3
>>>col = 3
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)]
>>>NewList
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g','h']]
>>>row = 4
>>>col = 4
>>>NewList = [MyList[col*i : col*(i+1)] for i in range(row)]
[['a', 'b', 'c', 'd'], ['e', 'f', 'g','h'], [], []]
答案 3 :(得分:0)
如果有人更喜欢列表列表,而不是平面列表中的元组列表,那么可以这样做:
a = range(20) # sample starting list
b = [] # new list
c = [] # alternate new list
# ny is length of new list. nx length of each list within it
nx = 5; ny = 4
bb = 0; ee = bb + nx # option one: sliding indeces for slices.
for ii in range(ny-1):
bb += nx
ee += nx
b.append(a[bb:ee])
c.append(a[slice(ii*nx,nx*(ii+1))]) # option two, use slice()
(我已经把整个for循环缩小到了一行列表推导,但没有成功。我使用它的方式,slice()几乎可以让你到那里。) 这些方法相对于提到的其他方法的一个可能的优点是,如果您的原始平面列表不是新的,期望的列表列表的维度的多个,则您不会丢失任何数据。需要注意的是,最后一个列表将比其他列表更短,因为它将包含"剩余的#34;。这些方法都没有让我感觉像是非常pythonic。