Python 复杂分组列表项

Python 复杂分组列表项,python,django,group-by,Python,Django,Group By,我需要使用python以Facebook格式显示通知。但是发现很难对项目进行分组。以下是来自查询的列表 通知必须按如下方式显示 John更改了产品名称、代码和描述 约翰更改了产品名称 约翰更改了帽子的变体代码 迈克改变了产品名称,裤子,帽子 Kiet更改了变体XXL衬衫的名称 使用pythongroupby是否有可能做到这一点?和按日期排序?基本上,您需要将行减少为具有相同用户名和产品名称值的行。我正在使用字典(默认dict)将用户/产品名称映射到其已更改元素的列表 from collec

我需要使用python以Facebook格式显示通知。但是发现很难对项目进行分组。以下是来自查询的列表

通知必须按如下方式显示

  • John更改了产品名称、代码和描述
  • 约翰更改了产品名称
  • 约翰更改了帽子的变体代码
  • 迈克改变了产品名称,裤子,帽子
  • Kiet更改了变体XXL衬衫的名称

使用pythongroupby是否有可能做到这一点?和按日期排序?

基本上,您需要将行减少为具有相同用户名和产品名称值的行。我正在使用字典(默认dict)将用户/产品名称映射到其已更改元素的列表

from collections import defaultdict
# Assuming your datastructure looks like:
rows = [['jeff', 'product', 'name', 'shirt'], ['jeff', 'product', 'code', 'shirt'], ['mike', 'product', 'name', 'trouser']]
user_index = 0
changed_index = 2
product_name_index = 3

delimeter = '&&&'
changed_items = defaultdict(list)
for row in rows:
    key = '%s%s%s' % (row[user_index], delimeter, row[product_name_index])
    changed_items[key].append(row[changed_index])

for key, changed in changed_items.iteritems():
    user, product = key.split(delimeter)
    print('%s changed %s of %s' % (user, ', '.join(changed), product))

如果您希望它按顺序排序,则必须使用默认的有序字典。您可以使用上述数据结构的此实现:

您可以使用
groupby
尝试以下方法,该方法似乎适用于您的现有数据,但可能需要进一步考虑其他边缘情况:

from itertools import groupby
from datetime import datetime

results = [
    ["User", "Type", "Changed", "Product Name", "Date"],
    ["John", "Product", "Name", "Shirt", "1-Jan-17"],
    ["John", "Product", "Code", "Shirt", "1-Jan-17"],
    ["John", "Product", "Description", "Shirt", "1-Jan-17"],
    ["John", "Product", "Name", "Hat", "1-Jan-17"],
    ["John", "Variant", "Code", "XXL Shirt", "1-Jan-17"],
    ["Mike", "Product", "Name", "Trouser", "2-Jan-17"],
    ["Mike", "Product", "Name", "Tie", "3-Jan-17"],
    ["Kiet", "Variant", "Name", "XXL Shirt", "4-Jan-17"]]

sorted_results = sorted(results[1:], key=lambda x: (datetime.strptime(x[4], '%d-%b-%y'), x[0]))

for k1, g1 in groupby(sorted_results, lambda x: x[0]):
    grouped_by_name = list(g1)
    v1, v2 = [], []

    for k2, g2 in groupby(grouped_by_name, lambda x: (x[1], x[3])):  # type, name
        v1.append(list(g2))

    for k2, g2 in groupby(grouped_by_name, lambda x: (x[1], x[2])):  # type, changed
        v2.append(list(g2))

    if len(v1) < len(v2):
        for entry in v1:
            entries = [changed for user, ptype, changed, pname, date in entry]
            print("{} changed {} of {} {}".format(entry[0][0], ', '.join(entries), entry[0][1], entry[0][3]))
    else:
        for entry in v2:
            entries = [pname for user, ptype, changed, pname, date in entry]
            print("{} changed {} of {} {}".format(entry[0][0], entry[0][2], entry[0][1], ', '.join(entries)))

项目所在的python数据结构是什么?二维列表?字典?当你只发布了一个帖子时,很难回答这个问题image@JeffMandell项目来自SQLAlchemy结果,可以转换为列表。在排序结果=。。。你知道吗?奇怪,你使用的是哪一个版本的Python?我使用的是3.4.4版本我可以使用time.strtime,让我检查一下Martin,最后一个帮助,我无法在print()中获取“user”,你能更正吗?谢谢