[['test', '172.18.74.146', '13:05:43.834', '2015_08_07'],
['test', '172.18.74.148', '12:27:39.016', '2015_08_07'],
['blah', '172.18.74.149', '11:18:33.846', '2015_08_12'],
['blah', '172.18.74.146', '12:27:38.985', '2015_08_12']]
我希望最终结果按日期和项目名称分组
[["test", "172.18.74.146, 172.18.74.148", "13:05:43.834, 12:27:39.016" ,
"2015_08_07"], etc..]
给定日期的名称将不相同。
我该怎么做?我尝试过使用groupby。
for g, data in groupby(sorted(my_list, key=itemgetter(0)), itemgetter(0)):
print(g)
for elt in data:
print(' ', elt)
但它并没有给我我想要的东西。
答案 0 :(得分:3)
你需要传递两个键来排序,名称和日期,然后使用str.join
来连接ip和时间
from itertools import groupby
from operator import itemgetter
out = []
for _, v in groupby(sorted(data, key=itemgetter(0, 3)),key=itemgetter(0,3)):
v = list(v)
ips = ", ".join([sub[1] for sub in v])
tmes = ", ".join([sub[2] for sub in v])
out.append([v[0][0], ips, tmes, v[0][-1]])
print(out)
['blah', '172.18.74.149, 172.18.74.146', '11:18:33.846, 12:27:38.985', '2015_08_12'],
['test', '172.18.74.146, 172.18.74.148', '13:05:43.834, 12:27:39.016', '2015_08_07']]
或者没有使用dict进行排序分组:
d = {}
for nm, ip, tm, dte in data:
key = nm, dte
if key in d:
v = d[key]
v[1] += ", {}".format(ip)
v[2] += ", {}".format(dte)
else:
d[key] = [nm, ip, tm, dte]
print(list(d.values()))
输出:
[['test', '172.18.74.146, 172.18.74.148', '13:05:43.834, 2015_08_07', '2015_08_07'],
['blah', '172.18.74.149, 172.18.74.146', '11:18:33.846, 2015_08_12', '2015_08_12']]