昨天写编程的时候遇到一个小逻辑.
同事给我传的数据类似于以下这条数据, 列表中的元素是个字典, 元素不止一个有很多, 且字典内的各个键值对的数据随机性较大.
[{'id': 10433, 'data': '{"num":18}', 'type': 'timelinelike', 'android_ip': '0.0.0.0', 'status': '1', 'number': 3}]
但, 为了业务需求, 我需要将同事传来的数据在进行整理. 需要将列表里的元素具有相同android_ip的放到一个列表中, 即使找不到和它相同的也要单独的放到一个列表中, 最后将这些整理好的列表在放入一个大列表中.
然后, 我就敲啊敲.
最开始的思路是
根据android_ip的值来判断
list = [ ]
list1 = [ ]
.......
for info in info_list:
if info['android_ip'] == 'ip':(ip的值我们是知道的, 不是随机生成的.)
list1.append(info)
elif .....:
...........
list.append(list1)
.....
是不是觉得好像完成了工作了, 严格意义上来说是的. 但是这里有个问题, 因为这个android_ip以后会有很多很多, 而且同事传的时候是随机选的. 但是你为了确保程序不出错, 你需要一直elif下去, 即使传过来的androidip是192.168.1.1也需要判断192.168.1.2 .......是不是觉得就不太合适了~~~~
所以, 作为一名python程序员, 这样写是不应该, 会让人笑话的.
后来我就尝试其它写法
升级版:
keys = set(info['android_ip'] for info in info_list)
mission_list = [[d for d in info_list if key == d['android_ip']] for key in keys]
print(mission_list)
完美解决
两句话就搞定, 但是这我觉得写的还不是很牛逼, 让人一眼就看懂了, 就不能装b了.
骨灰级:
import itertools
info = itertools.groupby(info_list, lambda x: x['android_ip'])
mission_list = [list(v) for key, v in info]
print(mission_list)
嗯, 不错. 这样写的话就非常高大上了, 一看就是大神的操作~~~瞬间有逼格.