2014-09-13 82 views
-3

去除专栏中,我有一个数据集,我到Python元组读取,它看起来像下面的一个,创建与特定的列值作为关键的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':[('b1','2:00 pm','z1'),('c1','4:00 pm','y2')], '2':[( 'b2','3:00 pm','z2'),('c4','4:00 pm','x2')], '3':[('b3','3:00 pm',' z3')] }' – 2014-09-13 09:29:09

+0

是的。与此类似。因为我想输入每个块到我的算法进行并行处理。算法根据每个块中的关键字区分块。 – 2014-09-13 09:36:23

+0

请从问题中删除您的字典示例。它真的让人神经紧张,因为它是完全不好的语法。我的蟒蛇眼睛不能忍受它:) – Mejmo 2014-09-13 09:50:09

回答

1

只是要在文件的字典,没有一点投入的元组后来从tuples做出dict

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]) 
+0

我无法对列名称进行硬编码,因为它基于数据集更改。而加起来,我的列数根据数据集而不同。 – 2014-09-13 09:26:43

+0

我没有硬编码任何名称,名称是无关紧要的,我只是把这一行分成四部分。如果你的列数不同,你如何将它们放入元组中? – 2014-09-13 09:30:25

+0

我做他们这样的..开放(文件名)为f: f_csv = csv.reader(F,分隔符= '\ t') 标题=下一个(f_csv) tuple_attr =元组(头) 数据=元组(tuple(x)for f in f_csv)我不能根据这些列名拆分行,因为数据集每次都不相同。 – 2014-09-13 09:35:08