识别散列中具有多个值的键 table
Identifying keys with multiple values in a hash table
我是 Python 脚本的初学者。
我有一个包含 5 列和超过 1000 行的 CSV 文件。我附上了一张屏幕截图,以了解该文件的外观。 (我只包括了 4 行,但真实文件有 1000 多行)。所以我要完成的任务是:
我需要打印一个输出 csv 文件,它根据以下条件打印原始 csv 文件的行。
- 每个 "number" 字段(第 1 列)应该只有一个 "name" 字段与之关联。如果它有多个与其关联的名称字段,则它必须抛出错误(或在 output.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 上找到并进行一些练习。知道要寻求什么解决方案就是编程的艺术!玩得开心...如果这对您来说不好玩,请雇用一名程序员!
我是 Python 脚本的初学者。
我有一个包含 5 列和超过 1000 行的 CSV 文件。我附上了一张屏幕截图,以了解该文件的外观。 (我只包括了 4 行,但真实文件有 1000 多行)。所以我要完成的任务是:
我需要打印一个输出 csv 文件,它根据以下条件打印原始 csv 文件的行。
- 每个 "number" 字段(第 1 列)应该只有一个 "name" 字段与之关联。如果它有多个与其关联的名称字段,则它必须抛出错误(或在 output.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 上找到并进行一些练习。知道要寻求什么解决方案就是编程的艺术!玩得开心...如果这对您来说不好玩,请雇用一名程序员!