我想在python中从文本文件创建一个字典。我的文本文件是:
John Doe
Apples
Bananas
Oranges
Jane Dear
Apples
Bananas
Peaches
文本文件的格式为:
Name
Fruit
Fruit
.....
Fruit
empty line
Name
Fruit
.....
我想返回一个字典,其中包含水果作为键,名称作为值,例如:
{"Apples":["John Doe", "Jane Dear"], "Bananas":["John Doe", "Jane Dear"], "Peaches":["Jane Dear"], "Oranges":["John Doe"]}
我还不完全确定如何格式化文本文件。提前谢谢!
编辑:到目前为止我做了什么
def common(text):
x = open(text, "r")
a = {}
b = []
line = x.readline()
while line != "":
b.append(line)
line = courses.readline()
return b
def create_dict(lst):
a = []
b = {}
names = []
fruits = []
while lst != []:
if " " in lst[1]:
names += lst[1]
else:
fruits += lst[1]
这就是我迷失的地方......
答案 0 :(得分:0)
您可以使用itertools.groupby
和collections.defaultdict
之类的便捷工具执行以下操作:
from collections import defaultdict
from itertools import groupby
with open('work/test.txt') as f:
d = [
[s.strip() for s in g]
for k, g in groupby(f, key=lambda l: bool(l.strip())) if k
]
# [['John Doe', 'Apples', 'Bananas', 'Oranges'], ['Jane Dear', 'Apples', 'Bananas', 'Peaches']]
dd = defaultdict(list)
for l in d:
for fruit in l[1:]:
dd[fruit].append(l[0])
dd
# {'Apples': ['John Doe', 'Jane Dear'], 'Bananas': ['John Doe', 'Jane Dear'], 'Peaches': ['Jane Dear'], 'Oranges': ['John Doe']}
条件理解基于空或不属性将文件中的行分组,然后只取非空行组(if k
)。随后使用defaultdict
可以避免一些颠簸的代码来检查密钥是否已经存在。
答案 1 :(得分:-2)
需要对文本文件的格式进行更清晰的说明。为了这个答案,我假设文本文件的格式是这样的。
NAME_1
FRUIT_1
FRUIT_2
FRUIT_3
NAME_2
FRUIT_1
FRUIT_2
FRUIT_3
.
.
NAME_3
.
.
.
现在如果是这种情况,即在水果名称之后总是有一个双线断点(' \ n \ n')并且序列总是以人名开头,那么这是一种填充这本字典的方法。
with open('/path/to/file', 'r') as handle:
text = handle.read()
text = text.split('\n\n')
result = dict()
for item in text:
item = item.split('\n')
for fruit in item[1:]:
if fruit in result.keys():
result[fruit].append(item[0])
else:
result[fruit] = [item[0]]
希望这有帮助