根据最小子列表的长度下采样子列表

时间:2018-06-14 22:57:59

标签: python

我有一个列表,如下所示,子列表的数量和长度可以变化:

test = [[1, 5, 4, 3, 5, 2], [4, 2], [5, 2, 4, 3, 5], [5, 3, 1]]

我想将所有子列表下采样到最短子列表的长度 - 这种情况2.这意味着我想从所有子列表中随机选择2个元素作为输出。

对于大约100个子列表的更大列表,每个子列表超过100000个项目,最有效的方式是什么?

4 个答案:

答案 0 :(得分:3)

使用generator expressionlist comprehensionrandom.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]]

答案 1 :(得分:2)

仅使用标准库:

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]]

答案 2 :(得分:0)

另一种方法:

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]]

答案 3 :(得分:0)

使用列表理解的短而甜的单行:

from random import sample

[sample(l, len(min(test, key=len))) for l in test]