如何从python列表列表的每个位置提取数字

时间:2014-04-06 22:44:26

标签: python

我有一个清单:

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中的下一个子列表仅针对第二个位置执行相同的操作。

5 个答案:

答案 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 Nmap重叠到len中最长子列表的长度,以构建长度的临时列表N中的列表计算max长度。

reduce通过挑选相应输入子列表的i元素来构建结果中的每个子列表 - 但前提是该子列表足够长。

答案 2 :(得分:0)

一种奇怪而无益的方式(但也许容易理解):

  • 获取N
  • 中列表的最大长度
  • 将所有这些列表从0重复到最大值。
  • 如果您收到错误,那是因为您的原始列表(来自N的那个)没有该项目

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)