繁体   English   中英

将子列表截断到最小长度

[英]Truncate sublists to the lowest length

我有:

l = [[1,2,3],[3,4],[1,6,8,3]]

我想:

[[1,2],[3,4],[1,6]]

哪个是列表l ,其中所有子列表都被截断为在l中找到的子列表的最低长度。

我试过了:

min = 1000

for x in l:
    if len(x) < min: min = len(x)

r = []

for x in l:
    s = []
    for i in range(min):
        s.append(x[i])
    r.append(s.copy())

哪个有效,但写起来很慢而且很长。 我想通过列表理解或类似方法来提高效率。

您可以找到列表中每个项目的长度,然后从中选择最小元素。 稍后您可以使用此值截断列表中的所有项目

l = [[1,2,3],[3,4],[1,6,8,3]]
min_length  = min(map(len,l)) # using map with len function to get the length of each item and then using min to find the min value.
l = [item[:min_length] for item in l] # list comprehension to truncate the list

一个班轮 -


l = [item[:min(map(len,l))] for item in l] 

关于zip的一件有趣的事情是zip本身就是相反的,所以list(zip(*zip(*x)))给出了类似结构的x
并且zip在任何输入耗尽时停止迭代。

虽然结果是tuple并且嵌套列表没有被原地截断,但可以利用它来构建以下 output:

Output:

[(1, 2), (3, 4), (1, 6)]
l = [[1, 2, 3], [3, 4], [1, 6, 8, 3]]

print(list(zip(*zip(*l))))

使用del

n = min(map(len, l))
for a in l:
    del a[n:]

使用列表理解,单行:

l = [[1,2,3],[3,4],[1,6,8,3]]

print ([[s[i] for i in range(min([len(x) for x in l]))] for s in l])

或者:

print ([s[:min([len(s) for s in l])] for s in l])

Output:

[[1, 2], [3, 4], [1, 6]]

我们计算“range()”中子列表的最小长度,以迭代该数量的子列表并重建一个新的子列表。 顶级列表理解允许重构嵌套的子列表。

如果你有一个大的嵌套列表,你应该使用这个版本的两行:

m = min([len(x) for x in l])

print ([[s[i] for i in range(m)] for s in l])

或者:

print ([s[:m] for s in l])

使用 zip 并保留列表对象:

print (list([list(x) for x in zip(*zip(*l))]))

Output:

[[1, 2], [3, 4], [1, 6]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM