我有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'),
任务 - 制作一个元组或字典列表,其中我只有一个'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,评论)
感谢您的帮助!
答案 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}}
希望这会有所帮助。