2017-08-17 58 views
0

一定的價值我有日期的列表,列表中的每個dict有另一個列表:組列表通過在Python

list = [ 
    { 
    'date': 'X', 
    'tickets': [ 
     { 'price': 100 }, 
     { 'price': 120 }, 
     { 'price': 100 }, 
     { 'price': 100 }, 
    ] 
    }, 
    { 
    'date': 'Y', 
    'tickets': [ 
     { 'price': 300 }, 
     { 'price': 300 }, 
     { 'price': 100 }, 
     { 'price': 100 }, 
    ] 
    } 
] 

現在我通過日期循環與

print('Date, Number of Tickets') 
print('============') 

for element in list: 
    print(element.date + ' - ' + len(element.tickets)) 

這打印

Date, Number of Tickets 
============ 
X - 4 
Y - 4 

但我想它打印是

Date, Number of Tickets, Price 
============ 
X - 3 - 100 
X - 1 - 120 
Y - 2 - 300 
Y - 2 - 100 

所以我需要它團體票通過每個組的列表和循環。

因此,它可能是這樣的

print('Date, Number of Tickets, Price') 
print('============') 

for element in list: 
    groups = group_by(element.tickets, 'price') 

    for group in groups: 
    print(element.date + ' - ' + group.num_tickets + ' - ' + group.price) 

,但我不知道如何通過組價格的門票。另外,如果沒有票的日期(即門票= []),那麼我還需要一排date=?num_tickets=0price=None說。

+1

字典中python3.x不支持(點)的訪問密鑰。 – Rahul

+0

我不知道爲什麼你可能想組,但一個快速的方法來獲得價格清單是'價格= [票[「價格」]爲元素票[「門票」]'。 –

+1

建議:不要使用內置名稱作爲變量(列表)。 – Chikiro

回答

0

我相信你正在尋找itertools.groupby。爲了使其工作,您需要首先對price項目進行排序。

import itertools 

list_ = ... 

for element in list_: 
    groups = [list(g) for _, g in itertools.groupby(sorted(element['tickets'], key=lambda x: x['price']))] 

    if groups: 
     for group in groups: 
      print(element['date'], len(group), group[0]['price'], sep=' - ') 
    else: 
     print(element['date'], 0, None, sep=' - ') 

輸出:

X - 3 - 100 
X - 1 - 120 
Y - 2 - 100 
Y - 2 - 300 

不要將其命名列表爲list,或作爲字典dict,或任何其他內建的名字。


現在,設置list_[1]['tickets'] = [] ...

X - 3 - 100 
X - 1 - 120 
Y - 0 - None 
+0

但是我不能夠體驗'groups'可能是空的,然後不打印任何東西? – Jamgreen

+1

@Jamgreen組總是1或更大。 –

+0

用這種輕微的問題...做一個'list_ [1] [「門票」] = []'並重新運行......它並不完全符合在Q注:*另外,如果沒有日期的門票(即,tickets = []),那麼我仍然需要用date =?,num_tickets = 0和price = None來表示行。 –

1

遍歷您的數據和積累的門票價格爲collections.Counter然後打印出結果,例如:

from collections import Counter 

for item in data: 
    if not item['tickets']: 
     print(item['date'], 0, 'None', sep=' - ') 
     continue 
    for price, count in Counter(el['price'] for el in item['tickets']).items(): 
     print(item['date'], count, price, sep=' - ') 

給你:

X - 1 - 120 
X - 3 - 100 
Y - 2 - 100 
Y - 2 - 300 
+0

如果OP不擔心訂購,這是一個很好的解決方案。但是,如果需要排序,則需要排序的呼叫。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ好的...但是,無論訂單是通過入場訂單,價格的門票數量還是價格訂單 - 都可以在幾個地方適當地完成......這對一個羣體的好處是我們沒有必要對列表進行預先排序來對其進行聚合......即使我們確實需要按鍵順序對其進行排序,也可能會有一小排需要在分組之後進行排序的行。 –

+0

已經確認,我是因爲這個原因補充了這個解決方案:) –

0

首先:迭代所有價格以創建列表,然後對其進行分類。第二:將已排序的價格列表反饋給計數器。然後將它與字典列表中的日期結合起來。

from collections import Counter 

data = <data with ticket prices here> 

tickets = [{'date': x['date'], 'tickets_by_price': Counter(sorted([y['price'] for y in x['tickets']]))} for x in data] 

結果:

[ 
    { 
     'tickets_by_price': Counter({100: 3, 120: 1}), 
     'date': 'x' 
    }, 
    { 
     'tickets_by_price': Counter({300: 2, 100: 2}), 
     'date': 'y' 
    } 
]