2016-11-10 62 views
-1

我需要使用python以Facebook格式顯示通知。但是很難將項目分組。以下是查詢複雜的分組列表項

sample list

列表如下

  • 通知必須顯示約翰改變名稱,代碼,產品襯衫的描述
  • 約翰改變名稱產品帽子的
  • 約翰改變帽子的變體代碼
  • 邁克改變產品名稱褲子,帽子
  • Kiet改變變種XXL襯衫的名稱

有沒有可能使用python組做這個?並按日期排序?

+0

什麼是項目所在的Python數據結構?一個二維列表?一本字典?當您只發布圖片時很難回答這個問題 –

+0

@JeffMandell項目來自SQLAlchemy結果,可以轉換爲列表。 –

回答

1

你可以使用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))) 

這會顯示以下輸出:

John changed Name, Code, Description of Product Shirt 
John changed Name of Product Hat 
John changed Code of Variant XXL Shirt 
Mike changed Name of Product Trouser, Tie 
Kiet changed Name of Variant XXL Shirt 
+0

它說''模塊'對象沒有屬性'strptime'「在sorted_results = ...任何想法? –

+0

奇怪,您使用的是哪個版本的Python? –

+0

我正在使用的版本3.4.4 –

1

基本上,您需要將行減少爲具有相同用戶和產品名稱值的行。我正在使用字典(默認字典)將用戶/產品名稱映射到其更改元素的列表。

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)) 

如果你想按順序排序,你將不得不使用默認的AND順序字典。您可以使用此實現上述數據結構:https://stackoverflow.com/a/6190500/3741585

+0

謝謝!你給了我一個想法如何進行.. –