繁体   English   中英

在Python中排序的字典中连续查找和计数相同的值?

[英]Find & count identical values in a row in a sorted dict in Python?

我通过其中一个键(日期/时间)对字典进行了排序。 我想将8个连续匹配的键值(“艺术家”和“专辑”)算作1张专辑。 这可能吗?

from datetime import datetime, timedelta
from itertools import groupby

def change_date(self):

    entries = self.data_to_dict()
    entries.sort(key=lambda x: (x['datetime']), reverse=False)

    for x in entries:
        album = x['artist'], x['album']
        grouped_album = [(k, sum(1 for i in g)) for k,g in groupby(album)]
        print grouped_album

上面的输出如下。 我看到它几乎按照我想要的方式工作,但是groupby能否接受2个密钥并将它们作为1个元素处理? 还是我应该避开groupby?

[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('The War on Drugs', 1), ('Slave Ambient (Deluxe Edition)', 1)]
[('Arcade Fire', 1), ('Funeral', 1)]
[('Arcade Fire', 1), ('Reflektor', 1)]
[('Arcade Fire', 1), ('The Suburbs', 1)]
[('Tame Impala', 1), ('Lonerism', 1)]
[('Tame Impala', 1), ('Lonerism', 1)]

原始数据的格式如下:

[{'album': 'Lonerism', 'song': 'Led Zeppelin (Bonus Track)', 'datetime': '2014-12-10 08:03:00', 'artist': 'Tame Impala'}, {'album': 'Lonerism', 'song': 'Feels Like We Only Go Backwards', 'datetime': '2014-12-10 08:00:00', 'artist': 'Tame Impala'}, {'album': 'The Suburbs', 'song': 'Empty Room', 'datetime': '2014-12-10 07:57:00', 'artist': 'Arcade Fire'}]

由于最后3行是循环执行的,因此groupby每次仅接收一张专辑。

您应该删除for(最后4行)的内部,然后执行以下操作:

首先将entries转换为albums

albums = [(x['artist'], x['album']) for x in entries]

然后将所有相册分组在一起:

grouped_albums = [(k, sum(1 for _ in g)) for k,g in groupby(albums)]

顺便说一句-字典未排序。 您拥有的不是字典,而是元组列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM