python 如何将键和值都有空格的字符串转换为字典[已关闭]

eblbsuwk  于 2023-02-18  发布在  Python
关注(0)|答案(3)|浏览(182)

3小时前关门了。
Improve this question
我有一个字符串包含键,值对,但问题是没有分隔符和键和值都可以有空格。我想得到所有的键值对。
input_string_1 = "Emp name: Alice Smith Age: 25 Occupation: Software Engineer Work Exp: 10_years Education: HiringYear: 2020"
并期望输出如下

Emp name: Alice Smith 
Age: 25 
Occupation: Software Engineer
Work Exp: 10_years
Education: 
HiringYear: 2020

我试着用这样的方法来制动绳子

lines = input_string_1.split()

for i in range(1, len(lines)):
    if ":" in lines[i]:
        lines[i] = "\n" + lines[i]

output_str = " ".join(lines)

使用此方法时,不能正确转换具有空格的关键字。
获取类似输出

Emp 
name: Alice Smith 
Age: 25 
Occupation: Software Engineer Work 
Exp: 10_years 
Education: 
HiringYear: 2020

此外,这些键也不是预定义的

q8l4jmvw

q8l4jmvw1#

这是我想到的最好的解决方案。我不得不给值添加一个条件,即值最多只能包含2个空格值。下面的代码将把上面的特定字符串解析到字典中。

content = "Emp name: Alice Smith Age: 25 Occupation: Software Engineer Work Exp: 10_years Education:  HiringYear: 2020"

items = content.split(' ')

new_dict = {}
key = ''
value = ''
key_created = False
value_length_count = 0
last_item = items[-1]

for item in items:
    if not key_created:
        if ':' in item:
            if key == "": 
                key += item
            else:
                key = f'{key} {item}' 
            
            key_created=True
        else:
            if key == "": 
                key += item
            else:
                key = f'{key} {item}' 
    else:
        if ':' in item:
            new_dict[key] = value
            print(item)
            key = item
            value = ''
            value_length_count = 0
        else:
            if value_length_count < 2:
                value_length_count += 1
                if value == "": 
                    value += item
                else:
                    value = f'{value} {item}'
            else:
                value_length_count = 0
                new_dict[key] = value
                key_created = False
                key = item
                value = ''
                
    if item == last_item:
        new_dict[key] = value
7vux5j2d

7vux5j2d2#

为了普遍解决这个问题,你描述谷歌雇用,并了解他们是如何能够提供这么好的匹配搜索引擎的请求。他们有你需要拿出一个软件能够执行你期望它做的知识。
但是......无论如何,尝试一下肯定是一个很好的练习。只是为了自己看看实际问题在哪里。
为了让你开始以下一些建议:请考虑以下部分

"Education:  HiringYear: 2020"

2020肯定是字典的值标记,并且作为左侧:的直接邻居的HiringYear必须是键(没有缺失键......仅假定缺失值)。HiringYear左侧的:不能在格式良好的字典中存在,但缺失一些值。
从上面你可以得出结论,你需要在HiringYear and the之间的双空间分裂:“with the consequence that you become aware of the fact that Education”必须是具有空值(一个空格)的键。
通过类似的思考路径,你会在字符串中找到另一个双倍空间,在那里分裂是最有意义的,因为双倍空间分裂比单个空间分裂更强烈,然后在你的情况下得到一个解。
记住以上几点,您就可以编写能够以自动化方式执行上述注意事项的代码,从而获得实用的解决方案。
在这种情况下,你会注意到,你不能以一种非常简单的自动化方式决定在哪里拆分name: Alice Smith Age: 25。令牌Smith属于哪里?属于前一个字典项的值还是下一个字典项的键?。给定对字典上下文的理解,一个简单的决定,但很难放入一个简单的程序代码。
它仍然是可以解决的,但需要大量的假设和对语言的一些基本理解(现代翻译和搜索引擎可以做到这一点)。

rsl1atfo

rsl1atfo3#

下面是使用refor-loop的方法。

import re

input_string_1 = "Emp name: Alice Smith Age: 25 Occupation: Software Engineer  Work Exp: 10_years Education:  HiringYear: 2020"

pattern = re.compile(r'([\w\s]+):\s*([\w\s]+)(?=\s+\w+:|$)')
matches = re.findall(pattern, input_string_1)

data_parts = [f"{match[0]}: {match[1]}".strip() for match in matches]

my_dict = {}
for part in data_parts:
    if part.endswith(" Work"):
        part = part.split(" Work")[0]
    elif part.startswith("Exp"):
        part = f"Work {part}"
    print(part)
    items = part.split(":")
    key, value = items[0], items[1].strip()
    if value.isdigit():
        value = int(value)
    my_dict.update({key: value})
Emp name: Alice Smith
Age: 25
Occupation: Software Engineer
Work Exp: 10_years
Education:
HiringYear: 2020
print(my_dict)
{'Emp name': 'Alice Smith', 'Age': 25, 'Occupation': 'Software Engineer', 'Work Exp': '10_years', 'Education': '', 'HiringYear': 2020}

相关问题