如何在python中从文本文件创建字典?

时间:2017-12-04 06:11:43

标签: python list file dictionary text

我想在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]

这就是我迷失的地方......

2 个答案:

答案 0 :(得分:0)

您可以使用itertools.groupbycollections.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]]

希望这有帮助