gpt4 book ai didi

Python:通过比较文件输入创建具有多个值的新字典

转载 作者:太空宇宙 更新时间:2023-11-03 15:14:32 25 4
gpt4 key购买 nike

我在执行以下任务时遇到了一些小问题。

有两个文件。第一个文件( child 文件)包含 child 与其 parent 的身份证号码之间的联系,第二个文件(姓名文件)包含人员身份证号码和姓名之间的联系。

在 child 文件的每一行都有 parent 的识别码和他/她的 child 的识别码:

47853062345 60907062342
46906183451 38504014543
34105139833 36512129874

名称文件有识别码和名称:

47853062345 Kadri Kalkun
36512129874 Peeter Peedumets
38504014543 Maria Peedumets
46906183451 Madli Peedumets
34105139833 Karl Peedumets
60907062342 Liisa Maria Jaaniste

可以安全地假设名称文件不包含重复的名称或识别码。此外,children 文件中的每个识别码在名称文件中都有对应的名称。

函数 connect 有 2 个参数:子文件名和名称文件名。它返回一个字典,其中键是 parent 的名字,值是他/她的 child 的集合。

children.txt:

47853062345 60907062342
46906183451 38504014543
34105139833 36512129874
36512129874 38504014543
46906183451 48708252344
36512129874 48708252344

名称.txt:

47853062345 Kadri Kalkun
36512129874 Peeter Peedumets
38504014543 Maria Peedumets
46906183451 Madli Peedumets
34105139833 Karl Peedumets
48708252344 Robert Peedumets
60907062342 Liisa Maria Jaaniste

输出:

connect('children.txt', 'names.txt')

{'Peeter Peedumets': {'Maria Peedumets', 'Robert Peedumets'},
'Madli Peedumets': {'Maria Peedumets', 'Robert Peedumets'},
'Karl Peedumets': {'Peeter Peedumets'},
'Kadri Kalkun': {'Liisa Maria Jaaniste'}}

我已将这两个文件读入列表和字典中。用名称替换了 ID 代码,但我无法思考如何获得最终结果。到目前为止我的代码:

def connect(children_file,names_file):
#children = {}
# with open(children_file, encoding="UTF-8") as f:
#for line in f:
#(key, val) = line.split()
#children[key.strip("\ufeffn' ").strip("\n ")] = val
with open(children_file, encoding="UTF-8") as ins:
children = [[n.strip("\ufeffn' ").strip("\n ") for n in line.split()] for line in ins]

names = {}
with open(names_file, encoding="UTF-8") as f:
for line in f:
splitLine = line.split()
names[splitLine[0].strip("\ufeffn' ").strip("\n ")] = " ".join(splitLine[1:])
names.items()
for lst in children:
for ind, item in enumerate(lst):
if item in names:
lst[ind] = names[item]

d = {}
for i in range(len(children[0][:])):
if children[0][i] not in d:
d[children[0][i]] = set()
d[children[0][i]].add(children[1][i])


return d

print(connect("children.txt","names.txt"))

最佳答案

您的代码总体效率有点低。不要制作 child 列表,直接制作 map 。您可以利用字典setdefault method, or, you could use a collections.defaultdict ,但为了简单起见,我将使用前者。所以,简单地说:

>>> with io.StringIO(children_str) as cf, io.StringIO(names_str) as nf:
... parentmap = {}
... namemap = {}
... for line in cf:
... pid, cid = line.strip().split()
... parentmap.setdefault(pid, set()).add(cid)
... for line in nf:
... nid, name = line.strip().split(maxsplit=1)
... namemap[nid] = name
...
>>> from pprint import pprint
>>> pprint(parentmap)
{'34105139833': {'36512129874'},
'36512129874': {'38504014543', '48708252344'},
'46906183451': {'38504014543', '48708252344'},
'47853062345': {'60907062342'}}
>>> pprint(namemap)
{'34105139833': 'Karl Peedumets',
'36512129874': 'Peeter Peedumets',
'38504014543': 'Maria Peedumets',
'46906183451': 'Madli Peedumets',
'47853062345': 'Kadri Kalkun',
'48708252344': 'Robert Peedumets',
'60907062342': 'Liisa Maria Jaaniste'}

注意,我使用 io.StringIO 假装我正在处理一个文件,相反,我正在处理直接从问题复制的字符串。但是 io.StringIO 可以让您将字符串视为文件,但您只需像平常一样打开文件即可。另请注意,当我从 names.txt 中拆分行时,我使用了 maxsplit 参数,因此名称本身不会被拆分。

要获得最终结果,只需使用:

>>> final = {namemap[k]:{namemap[n] for n in v} for k,v in parentmap.items()}
>>> pprint(final)
{'Kadri Kalkun': {'Liisa Maria Jaaniste'},
'Karl Peedumets': {'Peeter Peedumets'},
'Madli Peedumets': {'Robert Peedumets', 'Maria Peedumets'},
'Peeter Peedumets': {'Robert Peedumets', 'Maria Peedumets'}}

关于Python:通过比较文件输入创建具有多个值的新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43973744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com