识别散列中具有多个值的键 table

Identifying keys with multiple values in a hash table

我是 Python 脚本的初学者。

我有一个包含 5 列和超过 1000 行的 CSV 文件。我附上了一张屏幕截图,以了解该文件的外观。 (我只包括了 4 行,但真实文件有 1000 多行)。所以我要完成的任务是:

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

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

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

所以我的预期输出应该是这样的。只有当 "number" 有多个 "name" 与之关联时,才应显示标志和消息。 如果 "name" 与多个 "number" 相关联,则不应对其进行标记。 (例如 11235 与 11234 同名,但未标记)。

号码名称选择标志消息 11234 1 不止1个名字 11234<br> 11234<br> 11235 ABCDEF A3F5H7 11236 MNOPQR F3D4D5

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

但是有人可以帮我开始吗?比如,我如何在 Python?

中实现它

感谢任何帮助。

谢谢!

以下是您应该首先学习和理解的几个概念:

导入和导出 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] 如果 key 已经在字典中,则将其删除 (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",然后调用您的处理函数并查看它是如何工作的。更好?学习编写简单的单元测试 :) .

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