将嵌套列表更改为多个单个列表
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')]
如果我有一个列表:
[[ 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')]