假设我有以下列表:
l=[[["a", "b", "c", "k"], ["a", "b", "c", "s", "u"], ["a", "b", "f", "t"], ["a", "b", "e", "l", "n", "o"]],[["a", "b", "d", "n", "o"], ["a","b", "d", "e", "n", "o"]]]
我想遍历每个元素并找到要执行此操作的长度,请执行以下操作:
s=[]
for i in l:
for j in i:
s.append(len(j))
可以正确地给我长度,如下所示:
[4, 5, 4, 6, 5, 6]
但是l
本身的长度为2,所以我希望输出如下所示:
[[4, 5, 4, 6],[5, 6]]
我想知道为什么会发生这种扁平化?
答案 0 :(得分:3)
您可以使用嵌套列表理解来保留嵌套结构:
[[len(j) for j in i] for i in l]
#[[4, 5, 4, 6], [5, 6]]
如果您喜欢for循环,则可以在考虑l
的长度的情况下预先初始化嵌套列表,并使用enumerate
到append
到每个子列表:
s = [[] for i in range(len(l))]
for ix, i in enumerate(l):
for j in i:
s[ix].append(len(j))
答案 1 :(得分:0)
您可以执行以下操作:
#!/usr/bin/python3
l=[[["a", "b", "c", "k"], ["a", "b", "c", "s", "u"], ["a", "b", "f", "t"], ["a", "b", "e", "l", "n", "o"]],[["a", "b", "d", "n", "o"], ["a","b", "d", "e", "n", "o"]]]
s=[]
for i in l:
subList=[]
for j in i:
subList.append(len(j))
s.append(subList)
print(s)
答案 2 :(得分:0)
这可能是矫kill过正,但是您可以定义一个递归函数,以将给定函数应用于给定列表列表中的最低级子列表,即应用于不完全由其他列表组成的所有子列表。除len
之外,这还可以用于更多级别的嵌套,不规则嵌套的列表以及其他功能。
def deep_map(f, lst):
if all(type(x) == list for x in lst):
# call recursively for nested sublists
return [deep_map(f, x) for x in lst]
else:
# apply to this sublist
return f(lst)
根据您的情况,以deep_map(len, l)
的身份致电以获得[[4, 5, 4, 6], [5, 6]]
。