我有一个需要处理670,000 +行的文本文件。 每行的格式为:
uid, a, b, c, d, x, y, x1, y1, t, 0,
我做了一些清理,并将每一行转移到一个列表中:
[uid,(x,y,t)]
我的问题是:如何合并不同列表中的(x,y,t)元组,但是有效地拥有公共uid?
例如: 我有多个列表
[uid1,(x1,y1,t1)]
[uid1,(x2,y2,t2)]
[uid2,(x3,y3,t3)]
[uid3,(x4,y4,t4)]
[uid2,(x5,y5,t5)]
......
我想将它们转移到:
[uid1,(x1,y1,t1), (x2,y2,z2)]
[uid2,(x3,y3,t3), (x5,52,z5)]
[uid3,(x4,y4,t4)]
......
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以使用groupby
中的itertools
方法。考虑到您的原始列表位于名为lists
的变量中:
from itertools import groupby
lists = sorted(lists) # Necessary step to use groupby
grouped_list = groupby(lists, lambda x: x[0])
grouped_list = [(x[0], [k[1] for k in list(x[1])]) for x in grouped_list]
答案 1 :(得分:1)
只需使用defaultdict
。
import collections
def group_items(items):
grouped_dict = collections.defaultdict(list)
for item in items:
uid = item[0]
t = item[1]
grouped_dict[uid].append(t)
grouped_list = []
for uid, tuples in grouped_dict.iteritems():
grouped_list.append([uid] + tuples)
return grouped_list
items
是您的初始列表的列表。
grouped_list
将是uid分组列表的列表。
答案 2 :(得分:0)
如果数据存储在数据框中,则可以使用.groupby
按'uid'进行分组,如果将值(x,t,v)转换为元组((x,t,v),)
,您可以.sum
(即连接它们)。
这是一个例子:
df = pd.DataFrame.from_records(
[['a',(1,2,3)],
['b',(1,2,3)],
['a',(10,9,8)]], columns = ['uid', 'foo']
)
df.apply({'uid': lambda x: x, 'foo': lambda x: (x,)}).groupby('uid').sum()
在我看来,它产生了:
uid foo
a ((1, 2, 3), (10, 9, 8))
b ((1, 2, 3),)
答案 3 :(得分:0)
如何使用defaultdict,像这样:
L = [['uid1',(x1,y1,t1)],
['uid1',(x2,y2,t2)],
['uid2',(x3,y3,t3)],
['uid3',(x4,y4,t4)],
['uid2',(x5,y5,t5)]]
from collections import defaultdict
dd = defaultdict(list)
for i in L:
dd[i[0]].append(i[1])
输出:打印(dd)
defaultdict(list,
{'uid1': [(x1, y1, t1), (x2, y2, t2)],
'uid2': [(x3, y3, t3), (x5, y5, t5)],
'uid3': [(x4, y4, t4)]})