我有一个清单:
N=[[0,3,4], [0,1,2,9,3], [0,3]]
我如何得到它所以使用该列表获取另一个列表,每个列表项是N
中列表项的每个位置的数字,以便新列表看起来像:
newList=[[0,0,0], [3,1,3], [4,2] ,[9], [3]]
所以newList中的第一项是一个子列表,其中包含N [0]中的第一个数字,N [1]中的第一个数字,以及N [2]中的第一个数字。 N中的下一个子列表仅针对第二个位置执行相同的操作。
答案 0 :(得分:4)
可以使用izip_longest
,然后过滤掉默认值,例如:
from itertools import izip_longest
N=[[0,3,4], [0,1,2,9,3], [0,3]]
new_list = [[el for el in items if el is not None] for items in izip_longest(*N)]
# [[0, 0, 0], [3, 1, 3], [4, 2], [9], [3]]
答案 1 :(得分:1)
尝试列表理解
newList= [reduce(lambda x,y: x + [y[i]] if i<len(y) else x, N, [])
for i in range(max(map(len,N)))]
for
只使用i
N
将map
重叠到len
中最长子列表的长度,以构建长度的临时列表N
中的列表计算max
长度。
reduce
通过挑选相应输入子列表的i
元素来构建结果中的每个子列表 - 但前提是该子列表足够长。
答案 2 :(得分:0)
一种奇怪而无益的方式(但也许容易理解):
N=[[0,3,4], [0,1,2,9,3], [0,3]]
newList = []
max_items = max([len(lst) for lst in N])
for n_lst in N:
for i in range(max_items):
if len(newList) <= i:
newList.append([])
try:
newList[i].append(n_lst[i])
except IndexError:
pass
print "new List: %s" % newList
另一种可能使代码更清晰的方法是将newList初始化为包含5个项目的列表,因为矩阵N([0,1,2,9,3]
)上的最长列表有5个元素。这样你就知道你的结果(newList
变量)将有5个列表:
N=[[0,3,4], [0,1,2,9,3], [0,3]]
newList = []
max_items = max([len(lst) for lst in N])
newList=list([] for _ in range(max_items))
for i in range(max_items):
for n_lst in N:
if len(n_lst) > i:
newList[i].append(n_lst[i])
print "new List: %s" % newList
请注意,您还可以检查您评估的列表的IndexException
是否为len()
> i
。
修改强>:
刚刚看到John Clements的回复(https://stackoverflow.com/a/22901233/289011),这是迄今为止的清洁工。
答案 3 :(得分:0)
以下内容如何:
# original list
N = [[0,3,4], [0,1,2,9,3], [0,3]]
# create a new list of `n` lists (n being the length of the longest sublist in N)
newList = [[] for i in xrange(max([len(l) for l in N]))]
# iterate over each list
# enumerate - use the index to append into correct target list
for l in N:
for i, val in enumerate(l):
newList[i].append(val)
print newList
收率:
[[0, 0, 0], [3, 1, 3], [4, 2], [9], [3]]
希望这有帮助! :)
答案 4 :(得分:0)
这是一个不使用列表推导的解决方案,但也不需要预处理步骤来确定最大列表长度。
N = [[0,3,4], [0,1,2,9,3], [0,3]]
newList = []
progress = True
i = 0;
while (progress):
progress = False
sublist = []
for list in N:
if len(list) <= i:
continue
else:
sublist.append(list[i])
progress = True
if not progress:
break
newList.append(sublist)
i = i+1
print(N)
print(newList)