在哈希表中标识具有多个值的键

时间:2015-05-14 23:08:28

标签: python csv hashtable

我是Python脚本的初学者。

我有一个包含5列和1000多行的CSV文件。我附上一个截图,以了解文件的样子。 (我只包含4行,但实际文件有超过1000行)。所以我想要实现的任务是:

我需要打印输出csv文件,该文件根据以下条件打印原始csv文件的行。

  • 每个"数字" field(column1)应该只有一个" name"与之相关的领域。如果它有多个与之关联的名称字段,则必须抛出错误(或在output.csv中的数字旁边显示一条消息)
  • 如果数字字段只有一个与之关联的名称,则只需打印整行即可。

CSV文件中的数据采用以下格式。

Number Name Choices 11234 ABCDEF A1B6N5 11234 ABCDEF A2B6C4 11234 EFGHJK A4F2 11235 ABCDEF A3F5H7 11236 MNOPQR F3D4D5

所以我的预期输出应该是这样的。标志和消息只应在"编号"时显示。有一个以上的名字"与之相关联。 如果"名称"已被关联到多个"数字"它不应该被标记。 (如11235与11234同名,但未标记)。

Number Name Choices Flag Message 11234 1 More than 1 name 11234
11234
11235 ABCDEF A3F5H7 11236 MNOPQR F3D4D5

我知道这可以作为哈希表实现,其中数字用作键,名称用作值。如果任何键的值计数大于1,我们可以设置一个标志并相应地打印错误消息。

但有人可以帮助我开始这个吗?如何,我如何在Python中实现它?

感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是您应该首先了解和理解的一些概念:

导入和导出CSV:https://docs.python.org/2/library/csv.html

计数器:https://docs.python.org/2/library/collections.html#collections.Counter

Defaultdict(int)用于计数:https://docs.python.org/2/library/collections.html#collections.defaultdict

听起来你需要column1才能成为字典的关键。如果您要计算它出现的次数(不清楚),那么您可以使用names = defaultdict(int); names[key]+=1

如果您想要的是删除没有计数的重复项,或者如果有重复项就会崩溃,那么您可以执行以下操作:

mydict = {}
with open('yourfile.csv', mode='r') as infile:
  reader = csv.reader(infile)
  with open('yourfile.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for row in reader:
      key = row[0]
      if key in mydict:
        #Could handle this separately
        print "Bad key, already found: %s. Ignoring row: %s" % (key, row)
        raise #Element already found
      mydict[key] = row

    writer.writerows(mydict.values())

如果这不起作用,请给我们样本输入和预期输出。无论哪种方式,这应该让你开始。另外,请耐心等待:你会通过做错事来了解最多,并找出错误的原因。祝你好运!

====

更新: 你有几个选择。开头最简单的可能就是构建两个列表然后输出它们。

使用key = row[1] 如果密钥已在字典中,请将其删除(del mydict[key])并将其添加到其他字典multiple_dict = {}; multiple_dict[key] = [number, None, None, Data, Message]

def proc_entry(row):
  key = row[1]
  Saved existing data

  if key in mydict:
    multiple_dict[key] = key, None, None, 1, "Message"
    del mydict[key]
  elif key in multiple_dict:
    #Key was already duplicated, increase flag?
    multiple_dict[key][4]+=1

此时,您的代码变得非常复杂,可以使用以下内容: number, name, value = row,并将您的代码拆分为函数。然后,您应该使用已知输入测试函数,以查看输出是否符合预期。 即预加载“mydict”,然后调用您的处理函数,看看它是如何工作的。更好的?学习编写简单的单元测试:)。

虽然我们可以为您编写,但这不是Stackoverflow的精神。如果您还有其他问题,可能需要将其拆分为尚未回答的精确问题。我在上面提到的所有内容都可以在Stackoverflow上找到并进行一些练习。知道什么样的解决方案就是编程的艺术!玩得开心......或者如果这对你不好玩,请雇佣程序员!