将嵌套列表更改为多个单个列表

Change nested list into multiple single lists

如果我有一个列表:

[[ A, B, C ], 10, [ 1, 2, 3 ], F]

最好将其更改为:

[ A, 10, 1, F]
[ B, 10, 2, F]
[ C, 10, 3, F]

嵌套列表的长度是一致的:len(list[0]) == len(list[2]),但len(list[0])可能是3, 2, 4,等等

l = [[ 'A', 'B', 'C' ], 10, [ 1, 2, 3 ], 'F']
mxl = len(max(l, key= lambda x: len(x) if type(x) is list else 1)) # length of our output
ret = [[] for i in range(mxl)] # creating a list of mxl emply lists
for i in l: # going through input
    if type(i) is list: # if input is list going through list
        for j,v in enumerate(i):
            ret[j].append(v)
    else: # if input is not list adding it mxl times
        for j in range(mxl): ret[j].append(i)
for i in ret: print(i) # printing output
['A', 10, 1, 'F']
['B', 10, 2, 'F']
['C', 10, 3, 'F']

如果你只使用单个值和相同长度的列表,你可以试试

l1 = [[ 'A', 'B', 'C' ], 10, [ 1, 2, 3 ], 'F']

def func(list_, len_):
    list2 = [[] for x in range(len_)]
    for x in list_:
        if type(x) == list:
            for count2, y in enumerate(x):
                list2[count2].append(y)
        else:
            for y in range(len_):
                list2[y].append(x)
    return list2

print('\n'.join([str(x) for x in func(l1, 3)]))

可能有更好的方法。

list1=[[ 'A', 'B', 'C' ], 10, [ 1, 2, 3 ], 'F']
max_len=max([len(x) for x in list1 if type(x)==list])
type_list=[type(x) for x in list1]
major=[]
for i in range(max_len):
    minor=[]
    for index,datatype in enumerate(type_list):
        if datatype==list:
            minor.append(list1[index][i])
        else:
            minor.append(list1[index])
    major.append(minor)

解释:计算 2 件事,第一,列表中存在的元素的最大长度,第二,存储每个元素的数据类型的列表。现在,循环找到的最大长度,使用内部循环,遍历之前创建的数据类型列表并在 list/non_list 之间找出并相应地附加

下面是使用列表订阅的方法:

l = [[ 'A', 'B', 'C' ], 10, [ 1, 2, 3 ], 'F']

l = [[l[0][i],l[1],l[2][i],l[3]] for i in range(len(l)-1)]

for a in l:
    print(a)

输出:

['A', 10, 1, 'F']
['B', 10, 2, 'F']
['C', 10, 3, 'F']

您也可以通过解压缩压缩列表来完成

mylist = [[ 'A', 'B', 'C' ], [10], [ 1, 2, 3 ], ['F']]

for i in mylist:
    for n in i:
        while len(i)< max([len(i) for i in mylist]):
            i.append(n)

unziplist = [list(i) for i in zip(*mylist)]
print(unziplist)

产出

[['A', 10, 1, 'F'], ['B', 10, 2, 'F'], ['C', 10, 3, 'F']]

让我们在这里 itertools 试试:

from itertools import cycle

list(zip(*(iter(x) if isinstance(x, list) else cycle([x]) for x in l)))
# [('A', 10, 1, 'F'), ('B', 10, 2, 'F'), ('C', 10, 3, 'F')]

请注意,如果子列表大小不等,这不会出错 - 输出的大小等于最短子列表的大小。


工作原理

遍历列表,如果该项目是一个列表,则将其转换为带有 iter 的迭代器,否则,如果是标量,则将其转换为循环迭代器(无限重复单个值)并将它们压缩在一起并列出.

第 0 步

 A     10    1      F
 B           2   
 C           3
l[0]  l[1]  l[2]  l[3]

第 1 步

(iter(x) if isinstance(x, list) else cycle([x]) for x in l)

 A     10    1      F
 B     10    2      F
 C     10    3      F
l[0]  l[1]  l[2]  l[3]

第 2 步

list(zip(*_))
[('A', 10, 1, 'F'), ('B', 10, 2, 'F'), ('C', 10, 3, 'F')]