Лучший способ реализовать Group_by?

1

Во множестве функциональных языков (python, ruby,...) или SQL мы можем напрямую использовать функцию Group_by (метод). Мой вопрос: если я хочу реализовать эту функцию (например, используя Java, C,.., которые не имеют "group_by", реализованных по умолчанию), что было бы лучшим способом сделать это? Следующая идея - общая идея подхода, любая идея лучше, чем эта?

Input: [ Key, Value ]
{ [ 'A', 1 ], [ 'B', 3 ], [ 'C', 1 ], [ 'A', 2 ], [ 'A', 6 ], [ 'B', 7 ] ... ... ... }

Output:
{ [ 'A', [ 1, 2, 6 ] ], [ 'B', [ 3, 7 ] ], [ 'C' [ 1 ] ], ... ... }

for element in "input": 
        for temp in "input":
            if ( temp.key == element.key )
                Output . getKey( element.key ) . addValue( temp.value );
            end if
        end for
end for

  • кроме того, пусть предполагается, что массив не отсортирован, и пусть предположим, что мы не сортируем его сначала (сначала сортировать его было бы очень просто).

  • Спасибо за это. Мы всегда можем сортировать его в первую очередь. Это один из способов сделать это. Кроме того, иногда это требует НЕ модифицировать ввод, что бы вы сделали? (копировать все входные данные было бы одним из решений, которое стоило бы много памяти)

  • Спасибо за то, что хэш-таблица также может решить эту проблему. Я считаю, что это самый распространенный способ сделать это. O (n) и сложность времени выполнения O (n).


(Я только демонстрирую идею в приведенном выше коде, не рассматриваю все детали)

Спасибо за ваш вдумчивый ответ!

  • 0
    Ваши входные объекты / структуры или массивы или хеш-карты?
  • 0
    Я не совсем уверен, что вы собираетесь здесь, но из ввода / вывода, я не думаю, что группа по функциям существует в Python - вам придется реализовать это самостоятельно, вероятно, используя defaultdict(list) - возможно, именно так я и реализовал бы это на других языках. - Какие-то значения отображения хеш-таблиц в какую-то структуру списка, которая поддерживает добавление.
Показать ещё 2 комментария
Теги:
algorithm
data-structures

2 ответа

1

В python вы можете использовать dictioanry

input = [('A', 1), ('B', 3), ('C', 1), ('A', 2), ('A', 6), ('B', 7)]

output = {}
for key, value in input:
    if not key in output:
        output[key] = []
    output[key].append(value)
  • 0
    благодарю вас. Ваш метод зависит от списка в Python имеет функцию хэш-таблицы. Без хеш-таблицы логика фактически такая же, как у меня. Но спасибо за указание на это.
1

Не рассматривайте это как ответ, а как комментарий. Дело в том, что я не могу отправлять комментарии в комментариях.

Общим подходом было бы это (легко адаптируемое практически к любому языку), если я правильно понял ваш вопрос:

питон:

def group_by(arr):
    arr.sort()
    newarr=[]
    temparr=[]
    k=""
    for i in arr:
        if i[0]!=k:
            if len(temparr)>0:
                newarr.append([k,temparr]) # newarr = newarr + [k, temparr] also works
            k=i[0]
            temparr=[i[1]]
        else:
            temparr.append(i[1])
    newarr.append([k,temparr])
    print(newarr)
  • 0
    Спасибо. Это один из способов сделать это - Сортировка. Спасибо за указание на это. Кроме того, я могу спросить, если вход не позволяет изменить. Чтобы ты делал? (Я согласен, копировать все данные - это один из способов сделать это, но тратить впустую столько памяти)
  • 0
    Извините, я не совсем понимаю. Что вы имеете в виду "вход не может изменить"?
Показать ещё 2 комментария

Ещё вопросы

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