[英]Downsample sublists based on length of smallest sublist
我有一个类似于以下列表的列表,子列表的数量和长度可以是可变的:
test = [[1, 5, 4, 3, 5, 2], [4, 2], [5, 2, 4, 3, 5], [5, 3, 1]]
我想将所有子列表缩减为最短子列表的长度-这种情况2。这意味着我想从所有子列表中随机选择2个元素作为输出。
对于包含约100个子列表的更大列表,每个子列表大于100000项,最有效的方法是什么?
将生成器表达式和列表理解与random.sample()
:
min_len = min(len(x) for x in data)
[random.sample(x, min_len) for x in data]
import random
data = [[1, 5, 4, 3, 5, 2], [4, 2], [5, 2, 4, 3, 5], [5, 3, 1]]
min_len = min(len(x) for x in data)
print([random.sample(x, min_len) for x in data])
[[5, 4], [4, 2], [4, 5], [5, 3]]
仅使用标准库:
import random
test = [[1, 5, 4, 3, 5, 2], [4, 2], [5, 2, 4, 3, 5], [5, 3, 1]]
min_size = float("inf")
for sublist in test:
length = len(sublist)
if length < min_size:
min_size = length
new_list = [random.sample(sublist, min_size) for sublist in test]
# [[5, 4], [2, 4], [5, 3], [1, 5]]
另一种方法是:
import random
test = [[1, 5, 4, 3, 5, 2], [4, 2], [5, 2, 4, 3, 5], [5, 3, 1]]
minlen = min(list(map(lambda x: len(x),test)))
print([random.sample(i,minlen) for i in test])
输出:
[[3, 5], [4, 2], [5, 3], [1, 3]]
使用列表理解的简短而有趣的一线:
from random import sample
[sample(l, len(min(test, key=len))) for l in test]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.