我仍然是Python的初学者。我有一个要过滤,合并和排序的元组。 元组看起来像这样:
id, ts,val
tup = [(213,5,10.0),
(214,5,20.0),
(215,5,30.0),
(313,5,60.0),
(314,5,70.0),
(315,5,80.0),
(213,10,11.0),
(214,10,21.0),
(215,10,31.0),
(313,10,61.0),
(314,10,71.0),
(315,10,81.0),
(315,15,12.0),
(314,15,22.0),
(215,15,32.0),
(313,15,62.0),
(214,15,72.0),
(213,15,82.0] and so on
关于列表的描述:第一列(id)只能有这6个值213,214,215,313,314,315,但顺序可以不同。第二列(ts)每6行具有相同的值。第三列(val)将具有一些随机浮点值
现在我的最终结果应该是这样的:
result = [(5,10.0,20.0,30.0,60.0,70.0,80.0),
(10,11.0,21.0,31.0,61.0,71.0,81.0),
(15,82.0,72.0,32.0,62.0,22.0,12.0)]
这是要删除的每一行中的第一列。第二列中的每个唯一值应该只有一个唯一的行。所以每个结果行的顺序应该是:
(ts,val corresponding to id 213,val corresponding to 214, corresponding to id 215,val corresponding to 313,corresponding to id 314,val corresponding to 315)
注意:我只能使用标准的python库。所以熊猫,numpy不能使用。
我尝试了很多可能性,但无法解决它。请帮我这样做。提前谢谢。
答案 0 :(得分:3)
您可以使用itertools.groupby
from itertools import groupby
result=[]
for i,g in groupby(lst, lambda x:x[1]):
group= [i]+map(lambda x:x[-1],sorted(list(g),key=lambda x:x[0]))
result.append(tuple(group))
print result
输出:
[(5, 10.0, 20.0, 30.0, 60.0, 70.0, 80.0),
(10, 11.0, 21.0, 31.0, 61.0, 71.0, 81.0),
(15, 82.0, 72.0, 32.0, 62.0, 22.0, 12.0)]
答案 1 :(得分:1)
稍微更改代码即可修复。如果您将i[1] in ssd[cnt]
更改为i[1] == ssd[cnt][0]
,则您的代码可能有效。同样在else
部分中,您应该向ssd
添加另一个列表,因为您正在创建另一组数据。此外,如果数据应根据其ID进行,则应按(ts,id)
对其进行排序。应用更改后:
tup.sort( key = lambda x: (x[1],x[0]) )
ssd = [[]]
cnt = 0
ssd[0].append(tup[0][1])
for i in tup:
if i[1] == ssd[cnt][0]:
ssd[cnt].append(i[2])
else:
cnt = cnt + 1
ssd.append([])
ssd[cnt].append(i[1])
ssd[cnt].append(i[2])
输出
[[5, 10.0, 20.0, 30.0, 60.0, 70.0, 80.0],
[10, 11.0, 21.0, 31.0, 61.0, 71.0, 81.0],
[15, 82.0, 72.0, 32.0, 62.0, 22.0, 12.0]]
答案 2 :(得分:0)
这是一个vanilla python解决方案,虽然我认为使用groupby更加pythonic。这确实有缺点,它必须在内存中构建dicts,因此它不会扩展到一个大的tup列表。
但是,这符合订购要求。
from collections import defaultdict
tup = ...
tup_dict = defaultdict(dict)
for id, ts, val in tup:
print id, ts, val
tup_dict[ts][id] = val
for tup_key in sorted(tup_dict):
id_dict = tup_dict[tup_key]
print tuple([tup_key] + [ id_dict[id_key] for id_key in sorted(id_dict)])
答案 3 :(得分:0)
我们希望迭代你sorted
的{{1}}个实例,在我们去的时候解压缩项目,但首先我们需要一个辅助变量来存储密钥和一个变量来存储我们的结果
tup
keys, res = [], []
for t0, t1, t2 in sorted(tup, key=lambda x:(x[1],x[0])):
参数是一个key
sorted`函数,用于对单个元组中每个元素的第二个和第一个项进行排序 - 所以这里我们有循环的主体
lambda function that instructs the
也就是说,如果元组中的第二个整数尚未处理,我们必须记住它正在处理的事实,我们想在结果变量中添加一个新的列表,它以第二个整数的值开头
要完成对单个元组的操作,我们确信 if t1 not in keys:
keys.append[t1]
res.append([t1])
中有一个以res
开头的列表,索引我们知道该列表索引的aux变量,因此我们可以将浮动附加到它......
t1
完成所有这些
i = keys.index(t1)
res[i].append(t2)
现在,在keys, res = [], []
for t0, t1, t2 in sorted(tup, key=lambda x:(x[1],x[0])):
if t1 not in keys:
keys.append[t1]
res.append([t1])
i = keys.index(t1)
res[i].append(t2)
中你有一个列表列表,如果你真的需要一个可以用列表推导转换的元组列表
res
答案 4 :(得分:0)
添加@Ahsanul Haque的答案他也需要它,所以代替list(g)
做sorted(g,key=lambda y:y[0])
你也可以从头开始使用元组
for i,g in groupby(tup,lambda x:x[1]):
gro = (i,) + tuple(map(lambda x:x[-1],sorted(g,key=lambda y:y[0])))
resul.append(gro)