我希望解析家谱数据,目标是创建一个包含名称、日期和出现次数的字典(以确保没有重复的单个条目)。下面是一个示例:
0 NOTE the lines until the next note are all correct
0 HEAD
0 jc INDI
1 NAME Jimmy /Connors/
1 SEX M
1 BIRT
2 DATE 1 JAN 1950
1 DEAT
2 DATE 31 DEC 2099
1 FAMC f1
1 FAMS f2
0 f2 FAM
1 HUSB jc
1 WIFE ce
1 CHIL aa
1 MARR
2 DATE 1 JUN 1960
1 DIV
2 DATE 1 JUN 1961
0 TRLR
0 NOTE Everything past this line is invalid
0 INDI id
0 FAM id
0 NAME invalid
0 SEX invalid
0 BIRT invalid
0 DEAT invalid
0 FAMC invalid
0 FAMS invalid
0 MARR invalid
0 HUSB invalid
0 WIFE invalid
0 CHIL invalid
0 DIV invalid
0 DATE invalid
1 INDI invalid
1 FAM invalid
1 HEAD
1 TRLR
1 DATE
1 NOTE bad note
1 DATE 1 JUN 2017
2 INDI id
2 FAM id
2 NAME invalid
2 SEX invalid
2 BIRT invalid
2 DEAT invalid
2 FAMC invalid
2 FAMS invalid
2 MARR invalid
2 HUSB invalid
2 WIFE invalid
2 CHIL invalid
2 DIV invalid
1 INVALID invalid
3 INVALID invalid
4 NOTE invalid
这是我到目前为止的代码(不完整,因为我被卡住了):
'''
No more than one individual with the same name and birth date
should appear in a GEDCOM file
'''
file_name = input("Give me a file name to parse (in single quotes): ")
target1 = 'NAME'
target2 = 'BIRT'
name = ''
count = 0
person_dict = {}
try:
file = open(file_name)
except IOError:
raise IOError("Can't open '{}'".format(file_name))
for index, line in enumerate(file):
word = line.strip().split()
if target1 in word:
name = word[index-1:]
arguments = " ".join(word[index-1:])
person_dict[name] = arguments
print(person_dict)
elif target2 in word:
birth = word[index-1:index+3]
clean_bdate = " ".join(word[index-1:index+3])
person_dict[date] = clean_bdate
print(birth)
else:
print('not name')
'''
if duplicates are found...
print("{} already exists. Removing duplicate entry.".format(arguments))
'''
我不断地得到
文件"user_story_1.py",第24行,person_dictname = arguments TypeError: unhashable type:'list‘
我已经尝试了很多方法,包括将我的列表变成一个元组,但似乎都不起作用。很抱歉,如果这看起来是一个基本的问题,我是编程新手,我已经被卡住了一段时间!
发布于 2018-06-18 02:16:21
在python中,字典只接受hashable类型作为键。
list不是hashable类型。但是,元组是。因此,它应该与元组一起工作。
要检查hashable是否可用,可以使用散列函数,如下所示
根据您的错误,以下是答案
person_dict[name] = arguments
这里的第一件事是一个list
。
因此,只需将其转换为元组,如下所示
person_dict[tuple(name)] = arguments
请注意,即使元组中有一个元素作为列表,它也是不可哈希的。
https://stackoverflow.com/questions/50899140
复制相似问题