2016-11-10 8 views
-1

私はFacebookの形式で通知を表示する必要があります。しかし、アイテムをグループ化することは難しいと感じています。複雑なグループ化リストの項目

  • を次のようにクエリ

    sample list

    からリストがされて次の通知が表示されなければならないジョンは、名前、コード、製品シャツの説明が変更

  • ジョンは
  • 製品ハットの名前を変更しましたジョン変更された帽子のバリアントコード
  • マイクが変更された製品の名前ズボン、帽子
  • Kiet変更バリアントの名前XXL Shirt

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

「 'module'オブジェクトには属性 '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

ありがとう! –

関連する問題