Группировка проводок по наименованиям Товаров

#python #string #list #grouping #counter

#питон #строка #Список #группировка #счетчик

Вопрос:

Использование Python3

Для данного массива транзакций сгруппируйте все транзакции по имени элемента. Возвращает массив строк, в котором каждая строка содержит имя элемента, за которым следует пробел и количество связанных транзакций.

Примечание.Отсортируйте массив по убыванию по количеству транзакций, затем по возрастанию в алфавитном порядке по имени элемента для элементов с соответствующим количеством транзакций.

Пример

 transactions = ['notebook', 'notebook', 'mouse', 'keyboard', 'mouse']  

Есть два элемента с 2 транзакциями каждый: «ноутбук» и «мышь». В алфавитном порядке это «мышь», «записная книжка». Существует один элемент с 1 транзакцией: «клавиатура». Возвращаемый массив, отсортированный по мере необходимости, [«мышь 2», «ноутбук 2», «клавиатура 1»]

Что у меня есть

 def get_trans(lst):  ans = {}   for i in lst:  ans[i] = ans.get(i, 0)   1  return ans  dictionary = get_trans(transactions)  print(dictionary)  {'notebook' : 2, 'mouse' : 2, 'keyboard' : 1}  data = list(dictionary.items()) an_array = np.array(data) print(an_array)  

Текущий вывод: «ноутбук» идет перед «мышью», отдельные строки для слова/количества

 [['notebook' '2']  ['mouse' '2']  ['keyboard' '1']]  

Желаемый вывод: «записная книжка» в алфавитном порядке после «мыши», количество слов-одна строка

 ['mouse 2', 'notebook 2', 'keyboard 1']  

Комментарии:

1. Это похоже на проблему с домашним заданием. Дайте нам знать, что вы уже пробовали, и задайте более конкретный вопрос.

2. Ты хочешь знать, что я пытался сделать. Другие редактируют то, что я пробовал. Вокруг и вокруг мы ходим

3. Затем измените вопрос на более конкретный: с какой частью у вас проблемы? Этот вопрос требует нескольких вещей. Не перечисляйте все требования, только те, с которыми у вас возникли проблемы. Создайте новый вопрос, если хотите.

4. @VikashBalasubramanian См. правку выше

5. Простая ошибка/опечатка — вы хотели ans.get(i, 0) 1 вместо ans.get(0, 1) 1

Ответ №1:

Ваша функция почти верна, только сначала вам нужно передать методу ключ, а затем значение по умолчанию get . Затем вы можете использовать sorted функцию для сортировки кортежей пар ключ-значение по dictionary количеству в порядке убывания и именам элементов в порядке возрастания:

 def get_trans(lst):  ans = {}  for i in lst:  ans[i] = ans.get(i, 0)   1  return ans  out = [' '.join([t[0],str(t[1])]) for t in sorted(get_trans(transactions).items(), key=lambda x:(-x[1],x[0]))]  

Выход:

 ['mouse 2', 'notebook 2', 'keyboard 1']  

Комментарии:

1. Спасибо за поправку. Вывод вашего ответа, по-видимому, состоит из трех кортежей. Где желаемый ответ состоит из трех строк [«мышь 2», «ноутбук 2», «клавиатура 1»] @Manlai A

2. @WilhelmGleiss смотрите правку.

3. Потрясающая работа! @Манлай А. Не могли бы вы отредактировать свой вывод, чтобы отразить правильный вывод

Ответ №2:

Манлай А дал правильный ответ. Я преобразовал его в функцию:

 def get_trans(lst):  ans = {}  for i in lst:  ans[i] = ans.get(i, 0)   1  return ans  # A function using get_trans() function with Manlai A's answer def grouping(lst):  out = sorted(get_trans(lst).items(), key=lambda x:(-x[1],x[0]))  out = [' '.join([t[0],str(t[1])]) for t in out]  return out  # Passing transactions list into the new function  grouping(transactions)  

Выход:

 ['mouse 2', 'notebook 2', 'keyboard 1']