Категоризация списка кортежей в Python - PullRequest
0 голосов
/ 30 апреля 2020

помогите мне, пожалуйста, я пытаюсь найти самый быстрый и логичный способ категоризации списка кортежей по значениям первого элемента кортежа. например, у меня есть список с кортежами типа

a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more

Как я могу динамически распределить его по группам, например

100to150 = [(100, 12), (112, 23), (145, 14)]
150to200 = [(165, 34), (178, 45)]
200to250 = [(227, 32), (234, 12)]
350to400 = [(378, 123), (356, 15)]

Таким образом, я использовал шаг 50, но я хочу иметь возможность изменить это, конечно. Неважно, что будет в выводе, может быть список в списке, например [[(100, 112), (124, 145)], [(165, 12), (178, 12)], [(234, 14)], [(356, 65)]] (случайные данные) или, может быть, список с кортежем, это не имеет значения. Я просто хочу иметь возможность определить длину категории и распечатать ее. Спасибо много.

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Вы можете попробовать что-то вроде этого. Это, конечно, даст вам словарь с категориями, но не отдельные переменные.

a = [(378, 123), (100, 12), (112, 23), (145, 14), (165, 34), (178, 45), (227, 32), (234, 12), (356, 15)] # and more and more

def categorize(array, step=50):
        d = dict()
        for e in array:
                from_n = e[0]//step*step
                s = f'{from_n}to{from_n+step}'
                if s not in d:
                        d[s] = []
                d[s].append(e)
        return d

print(categorize(a))

Вывод:

{'350to400': [(378, 123), (356, 15)], '100to150': [(100, 12), (112, 23), (145, 14)], '150to200': [(165, 34), (178, 45)], '200to250': [(227, 32), (234, 12)]}
0 голосов
/ 30 апреля 2020

Вы можете увидеть что-то вроде этого: Использование словаря для хранения сгруппированных значений, чтобы мгновенно получить их позже.

def categorize_by_first(pairs, step=50):
    d = {}
    for pair in pairs:
        range_start = (pair[0] // step) * step
        dict_key_name = f"{range_start}_{range_start + step}"

        if not d.get(dict_key_name):
            d[dict_key_name] = []

        d[dict_key_name].append(pair)

    return d

Вывод:

{'350_400': [(378, 123), (356, 15)],
 '100_150': [(100, 12), (112, 23), (145, 14)],
 '150_200': [(165, 34), (178, 45)],
 '200_250': [(227, 32), (234, 12)]}

Временная сложность группировки равна O (n) (мы только один раз перебираем список ввода).

Временная сложность получения элемента из словаря - это O (1)

Так что это должно быть эффективным .

0 голосов
/ 30 апреля 2020
l = [x for x in a if 100<x[0]<150]

Я должен сказать, что это тот минимум, который вам нужен для начала работы. Если вы хотите получить полное решение, вы можете представить его в виде функции, где ваши аргументы low и high (100, 150 в этом примере) являются аргументами. Вы можете даже получить список максимумов / минимумов, а затем пропустить через них все oop и собрать все результаты в виде списков кортежей.

...