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