【问题标题】:How to create a dictionary from a text file in python?如何从python中的文本文件创建字典?
【发布时间】:2017-12-04 06:11:43
【问题描述】:

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

这就是我有点迷路的地方......

【问题讨论】:

  • 请展示您迄今为止的尝试。

标签: python list file dictionary text


【解决方案1】:

您可以使用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 避免了一些颠簸的代码来检查键是否已经存在。

【讨论】:

    【解决方案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]]
    

    希望对你有帮助

    【讨论】:

    • text = handle.read() 显示错误,请同时检查版本
    • 问题是文件以写入模式打开,现已修复。
    • 还是没有结果
    • 你可以分享你正在使用的文本文件吗?
    • 我使用了您的文件示例。这是结果。 {'FRUIT_1': ['NAME_1', 'NAME_2'], 'FRUIT_2': ['NAME_1', 'NAME_2'], 'FRUIT_3': ['NAME_1', 'NAME_2'], '': ['NAME_2']}
    猜你喜欢
    • 2012-03-08
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2015-02-10
    • 2020-03-14
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多