我有一个数据集,我读入python作为元组,它看起来像下面的那样,
name time dept id
--------------------
b1 2:00pm z1 1
b2 3:00pm z2 2
c1 4:00pm y2 1
b3 3:00pm z3 3
c4 4:00pm x2 2
我正在尝试根据id值将数据划分为块。它应该是一个块,其中id列中的值为1的所有元组,另一个值为2的块,依此类推。我在想的是创建一个id为我的键的字典,我可以创建一个字典,但这里的故障是从字典中的值中删除id列。
由于元组是不可变的,我无法删除id列值,同时我需要该列值将其保存为我的字典中的键。 我正在寻找一个优化版本,因为我的代码必须处理数百万个元组。请建议。
答案 0 :(得分:1)
只需从文件中输入一个字典,就没有必要放入元组,然后再从dict
创建一个tuples
:
d = {}
with open("in.txt") as f:
f.next(),f.next() # skip headers
for line in f:
name, time, dept, id = line.split()
d.setdefault(id,[])
d[id].append((name,time,dept))
print d
{'1': [('b1', '2:00pm', 'z1'), ('c1', '4:00pm', 'y2')], '3': [('b3', '3:00pm', 'z3')], '2': [('b2', '3:00pm', 'z2'), ('c4', '4:00pm', 'x2')]}
如果id始终是最后一个元素:
d = {}
with open("in.txt") as f:
f_csv = csv.reader(f, delimiter='\t')
headers = next(f_csv)
tuple_attr = tuple(headers)
data = tuple(tuple(x.split()) for x in f_csv)
for tup in data:
d.setdefault(tup[-1],[])
d[tup[-1]].append(tup[:-1])
tup[-1]
获取键tup[:-1]
的最后一个元素获取除了值的最后一个元素。
你可以通过迭代f_csv来完全避免产生元组:
d = {}
with open("in.txt") as f:
f_csv = csv.reader(f, delimiter='\t')
headers = next(f_csv)
tuple_attr = tuple(headers)
for ele in f_csv:
d.setdefault(ele[-1],[])
d[ele[-1]].append(ele[:-1])