Нижний список подсписков основан на длине наименьшего подсписка

1

У меня есть список списков, как показано ниже, а число и длина подписок могут быть переменными:

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

Я хочу уменьшить все подсписные записи до длины кратчайшего подсписок - это случай 2. Это означает, что я хочу случайным образом выбрать два элемента из всех подписок в качестве вывода.

Для гораздо большего списка из примерно 100 подсписок, каждый из которых превышает 100 000 предметов, каким будет самый эффективный способ?

Теги:

4 ответа

3

Используя выражение генератора и понимание списка с помощью 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]]
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]]
0

Короткий и сладкий однострочный лайнер с использованием списка:

from random import sample

[sample(l, len(min(test, key=len))) for l in test]
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]]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню