大家好,这是我的第一篇帖子:)
我有一个小脚本,它创建了一个包含某些数据的列表:输出是一个列表,打印如下:
2018-06-07,thingA,100173
2018-06-07,thingB,35277
2018-06-08,thingA,87599
2018-06-08,thingB,35311
2018-06-09,thingA,94371
2018-06-09,thingB,45330
2018-06-10,thingA,104483
2018-06-10,thingB,51726
我正在尝试将其转换为这样的观点:
2018-06-07,100173,35277
2018-06-08,87599,35311
2018-06-09,94371,45330
2018-06-10,104483,51726
所以我想将具有相同日期的行连接到第二行的thingA和第三行的thingB。它看起来很容易,但我不知道如何咬它。
我的代码计算事物A和B的出现取决于日期:
[...'2018-06-09,thingA','2018-06-09,thingB'...]
yyyy = [[x,lista.count(x)] for x in set(lista)]
yyyy.sort()
for x in yyyy:
x = x[0] + "," + str(x[1])
亲切的问候, 的Pawel
答案 0 :(得分:1)
对于O(n)解决方案,您可以在列表collections.defaultdict
列表中使用L
:
from collections import defaultdict
d = defaultdict(list)
for date, thing, num in L:
d[date].append(num)
res = [[date, *nums] for date, nums in d.items()]
<强>结果:强>
print(res)
[['2018-06-07', 100173, 35277],
['2018-06-08', 87599, 35311],
['2018-06-09', 94371, 45330],
['2018-06-10', 104483, 51726]]
答案 1 :(得分:0)
您可以使用itertools.groupby
:
import itertools
data = [['2018-06-07', 'thingA', '100173 '], ['2018-06-07', 'thingB', '35277'], ['2018-06-08', 'thingA', '87599'], ['2018-06-08', 'thingB', '35311 '], ['2018-06-09', 'thingA', '94371 '], ['2018-06-09', 'thingB', '45330 '], ['2018-06-10', 'thingA', '104483 '], ['2018-06-10', 'thingB', '51726']]
new_data = [[a, *[i[-1] for i in b]] for a, b in itertools.groupby(sorted(data, key=lambda x:x[0]), key=lambda x:x[0])]
print('\n'.join(','.join(i) for i in new_data))
输出:
2018-06-07,100173,35277
2018-06-08,87599,35311
2018-06-09,94371,45330
2018-06-10,104483,51726
答案 2 :(得分:0)
非常感谢Ajax1234。
我需要做一些更改来准备正确的数据,最后我使用了你的帮助:
{{1}}
谢谢!