【问题标题】:Creating python dictionary with a particular column value as key and removing that column from value创建具有特定列值作为键的python字典并从值中删除该列
【发布时间】:2014-09-13 06:04:36
【问题描述】:

我有一个数据集,我将它作为元组读入 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': [('b1', '2:00pm', 'z1'), ('c1', '4:00pm', 'y2')], '2': [('b2', '3:00pm', 'z2'), ('c4', '4:00pm', 'x2')], '3': [('b3', '3:00pm', 'z3')] }
  • 是的。与此类似。因为我想将每个块输入到我的算法中以进行并行处理。算法根据每个块中的键来区分块。
  • 请从问题中删除您的字典示例。它真的很让人紧张,因为它是完全糟糕的语法。我的蟒蛇眼睛受不了了:)
  • 我已经这样做了..这只是我的输出应该是什么样子的一个奇怪的假设.. :)
  • 我不明白为什么有人给这个问题打负分,如果有什么不清楚的地方,欢迎大家澄清。伙计们,我无法读懂每个人的想法..

标签: python python-3.x dictionary


【解决方案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])

【讨论】:

  • 我无法对列名进行硬编码,因为它会根据数据集而变化。加起来,我的列数因数据集而异。
  • 我没有硬编码任何名称,名称无关紧要,我只是将行分成四个部分。如果您的列数不同,您如何将它们放入元组中?
  • 我正在这样做.. 使用 open(filename) as f: f_csv = csv.reader(f, delimiter='\t') headers = next(f_csv) tuple_attr = tuple(headers ) data = tuple(tuple(x) for x in f_csv) 我不能根据这些列名拆分行,因为数据集每次都不同。
  • @Jeeva:len() 函数不是必需的:您可以使用 seq[-1] 访问序列的最后一个成员。
  • @Jeeva:也许你应该从你的问题中删除 data = {(1 : ... 的东西,因为它不是有效的 Python 语法。而且很混乱!
猜你喜欢
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2023-01-04
  • 2022-11-12
相关资源
最近更新 更多