按项目名称对交易进行分组

Posted

技术标签:

【中文标题】按项目名称对交易进行分组【英文标题】:Grouping Transactions by Items' Names 【发布时间】:2022-01-15 14:36:12 【问题描述】:

使用 Python3

对于给定的交易数组,按项目名称对所有交易进行分组。返回一个字符串数组,其中每个字符串包含项目名称,后跟一个空格和关联交易的数量。

注意:对数组按交易计数降序排序,然后对匹配交易计数的项目按项目名称的字母顺序升序。

示例

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

有两个项目,每个项目有 2 个事务:“笔记本”和“鼠标”。按字母顺序,它们是“鼠标”、“笔记本”。 有一项具有 1 笔交易:“键盘”。 按要求排序的返回数组为['mouse 2', 'notebook 2', 'keyboard 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' 出现在 'mouse' 之前,字数/计数分开字符串

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

期望的输出:'notebook' 按字母顺序排列在'mouse'之后,字数/计数是一个字符串

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

【问题讨论】:

这似乎是一个家庭作业问题。让我们知道您已经尝试过什么并提出更具体的问题。 你想知道我尝试了什么。其他人编辑了我尝试过的内容。我们绕着绕着走 然后把问题改得更具体一些,你在哪个部分有问题?这个问题要求多方面的东西。不要仅列出您遇到问题的所有要求。如果您愿意,可以创建一个新问题。 @VikashBalasubramanian 见上文编辑 一个简单的错误/错别字 - 你想要 ans.get(i, 0) + 1 而不是 ans.get(0, 1) + 1 【参考方案1】:

Manlai A 提供了正确答案。我已将其转换为函数:

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

【讨论】:

【参考方案2】:

您的函数几乎是正确的,只是您需要先将密钥传递给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']

【讨论】:

感谢指正。您的答案输出似乎是三个元组。期望的答案是三个字符串 ['mouse 2', 'notebook 2', 'keyboard 1'] @Manlai A @WilhelmGleiss 看到编辑。 惊人的工作! @Manlai A. 你会编辑你的输出以反映正确的输出吗

以上是关于按项目名称对交易进行分组的主要内容,如果未能解决你的问题,请参考以下文章

高级 PDF NetSuite - 按通用字段值对项目表进行分组

按不同的 id 对项目数组进行分组

如何仅按某个列值的前几个字母对 SQL 查询进行分组?

如何在一行中按顺序对所有项目的总金额进行分组

Laravel 8:按嵌套列对分组数组进行排序 - 我应该在 sortBy 闭包中放入啥?

SQL Query按时间对项目进行分组,但只有在彼此靠近的情况下?