对于dicts列表:合并相同的键值,求和另一个diff。值,计算每次合并迭代+1

时间:2015-12-07 18:15:32

标签: python list dictionary merge tuples

我有dicts(或元组)列表,其中:

if tuples:

.check()

或者可以转换成dict,如:

 comment_id, user_id,     comment_date, comment_time, comment_likes
('51799',   '112801710', '2015-12-07',  '00:03:21',   '0'),
('51761',   '112801710', '2015-12-06',  '19:31:46',   '3'),
('51764',   '112801710', '2015-12-06',  '19:54:19',   '0'),
('51741',   '112801710', '2015-12-06',  '14:17:34',   '2'),
('51768',   '52879933',  '2015-12-06',  '20:03:34',   '0'),
('51766',   '52879933',  '2015-12-06',  '21:33:34',   '0'),
  • comment_id - 始终是唯一的,在此列表中无法满足两次,
  • user_id - 此列表不是唯一的,它可以在帖子集中留下评论的次数(当然我想将其用作计数器)
  • comment_date comment_time - 可以忽略,需要从db中选择,
  • comment_likes - 每个评论都有多少赞。

任务 - 制作一个元组或字典列表,其中我只有一个'user_id'唯一,接下来每个项目有多少'喜欢'(总和)以及此评论在列表中找到相同用户ID的次数

澄清一下,这是预期的结果:

{'comm_count': 1, 'user_id': '217407103', 'likes': 0},

不知怎的,我做了一些不同的设置,但它们没有按预期工作。

代码示例:

  user_id,      comment_likes,      comments_left
('112801710',   '5',                '4'),
('52879933',    '0',                '2')

这种方式可以使user_id只会遇到一次的列表,并使用相同的user_id创建dict,但也可以使用值。然后它检查列表中的所有ID,如果此id符合第二次 - 更新键值。但结果不正确,我失去了重要的东西。

排序的另一个好方法:

    for row in results:
    user_id = row[1]        # Get user id ['39411753']
    comm_id = row[0]        # Get post id ['51  575']
    comm_likes = row[4]     # Get post likes ['2']
    comm_likes = int(comm_likes)
    all_users_id_comments.append(user_id)
    if user_id not in temp_list:
        comm_count = 1
        temp_list.append(user_id)
        user_ids_dict = {'user_id':user_id,'likes':comm_likes,'comm_count':comm_count}
        result_dicts_list.append(user_ids_dict)
        if user_id in temp_list:
            for item in result_dicts_list:
                if item['user_id'] == user_id:
                    item['comm_count'] += 1
                    item['likes'] += comm_likes

根据user_id创建一个集合,每个评论的dicts列表,用户离开:

merged = {}
for dict in user_comments_list_dicts:
for key,value in dict.items():
    if key not in merged:
        merged [key] = []
    merged [key].append(value)
print(merged)

但我不能称之为“144964044”的价值 - 它只显示'144964044'而不是那个列表。也让我困惑。

使用python可以很好地解决这个问题,但恕我直言这个案例也可以在SQL db方面解决,我不知道。也许我可以更新user_id找到两次或更多次的每一行并总结它喜欢并在comments_count中为每个添加+1。

另外python家伙给了我一个使用建议:comprehensions,sets或key \ value - 但我全部使用它们 - 但仍然没有结果。

我想成为有意识的新手,所以我按照你对MySQL查询的建议并找到了这样的方法:

'144964044': [
          {'comm_id': '51640', 'likes': '0'},
          {'comm_id': '51607', 'likes': '0'},
          {'comm_id': '51613', 'likes': '0'},
          {'comm_id': '51591', 'likes': '1'},
          {'comm_id': '51592', 'likes': '0'},
          {'comm_id': '51317', 'likes': '0'},
          {'comm_id': '51319', 'likes': '0'},
          {'comm_id': '51323', 'likes': '0'}
          ],

这将显示如下内容:

"""SELECT SUM(comment_likes) AS value_sum, comment_user_id, COUNT(*)
                        FROM pub_comments_weekly
                        GROUP BY comment_user_id"""

其中:(喜欢,user_id,评论)

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

计数和求和在数据库中使用count,sum函数和group by来完成。

由于某种原因你必须在python中使用它,使用字典将是我对元组的选择。我还建议使用字典词典作为结果数据结构,因为它可以更容易地访问它。

list = [ {'comment_id':'51799',   'user_id':'112801710', 'comment_date':'2015-12-07', 'comment_time': '00:03:21',   'comment_likes':'0'},
         {'comment_id':'51761',   'user_id':'112801710', 'comment_date':'2015-12-06',  'comment_time':'19:31:46',   'comment_likes':'3'},
         {'comment_id':'51764',   'user_id':'112801710', 'comment_date':'2015-12-06',  'comment_time':'19:54:19',   'comment_likes':'0'},
         {'comment_id':'51741',   'user_id':'112801710', 'comment_date':'2015-12-06',  'comment_time':'14:17:34',   'comment_likes':'2'},
         {'comment_id':'51768',   'user_id':'52879933',  'comment_date':'2015-12-06',  'comment_time':'20:03:34',   'comment_likes':'0'},
         {'comment_id':'51766',   'user_id':'52879933',  'comment_date':'2015-12-06',  'comment_time':'21:33:34',   'comment_likes':'0'}]


def combine(list):
    result = {}
    for item in list:
        resItem = result.get(item['user_id'], None)
        if not resItem:
            resItem =  {'comment_likes': int(item['comment_likes']), 'comments_left': 1}
        else:
            resItem['comment_likes'] += int(item['comment_likes'])
            resItem['comments_left'] +=1
        result[item['user_id']] = resItem

    print result

combine(list)

结果:

{'112801710': {'comment_likes': 5, 'comments_left': 4}, '52879933': {'comment_likes': 0, 'comments_left': 2}}
希望这会有所帮助。