#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']