创建具有特定列值作为键的python字典并从值中删除该列

时间:2014-09-13 06:04:37

标签: python python-3.x dictionary

我有一个数据集,我读入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列值,同时我需要该列值将其保存为我的字典中的键。 我正在寻找一个优化版本,因为我的代码必须处理数百万个元组。请建议。

1 个答案:

答案 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])
相关问题