按Python中的某个值列出组列表

时间:2017-08-17 09:59:39

标签: python python-3.x list grouping itertools

我有一个包含日期的列表,列表中的每个字典都有另一个列表:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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命名为dict,或任何其他内置名称。

现在,设置list_[1]['tickets'] = [] ...

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

答案 2 :(得分: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'
    }
 ]