簡體   English   中英

根據最小子列表的長度對子列表進行下采樣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM