【问题标题】:Local variables in a dictionary function in PythonPython中字典函数中的局部变量
【发布时间】:2020-11-14 19:16:36
【问题描述】:

我正在尝试处理以下要求。作为 Python 编程的初学者,我无法摆脱在声明变量时面临的问题。我有一个巨大的 XML,我需要打开它并从中创建三个字典。

这是我的编程步骤。

  1. 使用内置的打开功能打开文件
  2. 从上面创建的对象中读取每一行
  3. 在某些标签之间,我需要搜索一个模式并将数据填充到字典中。

XML 文件看起来像

<tag_1>
    name=(pattern1)
    age=(pattern1.1)
    company=(pattern1.2)
<\tag_1>

<tag_2>
    name=(pattern2)
    age=(pattern2.1)
    company=(pattern2.2)
<\tag_2>

<tag_3>
    name=(pattern3)
    age=(pattern3.1)
    comapany=(pattern3.2)
<\tag_3>

以此类推,上面有重复的标签。

从上面的每个标签,我需要创建 3 个字典,例如:

dict1[pattern1]['age']=pattern1.1
dict1[pattern1]['company']=pattern1.2

dict2 和 dict3 也是如此。

创建了一个字典函数,将参数作为行、字典传递。

for line in file.readlines():
    dict_instance(line, dictionary_1 )
    dict_instance(line, dictionary_2 )
    dict_instance(line, dictionary_3 )



def dict_instance(line, object):
    #ON TAG START (i have this condition set in my code)
    if re.search(r'name=(.*)', line):
        name=re.search(r'name=(.*)', line).group(1)
    if re.search(r'age=(.*)', line):
        age=re.search(r'age=(.*)', line).group(1)
    if re.search(r'company=(.*)', line):
        company=re.search(r'company=(.*)', line).group(1)
    #ON TAG END (i have this condition set in my code)
    object[name]={}
    if not age:
        object[name]['age']=age
    if not company:
        object[name]['company']=company

每个数据标签都应该在每个字典中,比如tag1到dict1,tag2到dict2,tag3到dict3。

现在我的问题是如何创建每个字典本地的“姓名”、“年龄”和“公司”变量,如果我创建全局变量,这些将在所有三个字典中混合,从而在其中创建不正确的数据.

以上如有缩进问题请忽略。

【问题讨论】:

  • dict_instance 是一个函数吗?我错过了 def 关键字,但它似乎是一个函数。 E:另外,你似乎每读一行就调用它 3 次,这对我来说没有意义。
  • 函数内部的变量是函数的局部变量
  • (读者一般不会忽略缩进的问题——如果你的问题的呈现有错误,请更正。如果这里有错误但你的实际代码中没有,读者会给你错误的建议)。
  • 糟糕,因为缺少 def 关键字,有没有更好的方法来处理这个问题,而不是将每一行传递给三个函数调用。并且默认情况下,这些变量不会被视为局部变量,从而获得未绑定的局部错误异常。这个论坛的好处是如果我们有缩进错误,它不允许提出问题,所以希望没有这样的问题。
  • 为什么需要 3 个字典?每个tag一个?

标签: python dictionary


【解决方案1】:

我不确定我是否理解这些要求。但这里有一些可能有用的方法:

xml_content = """<tags>
<tag_1>
    name=(pattern1)
    age=(pattern1.1)
    company=(pattern1.2)
</tag_1>

<tag_2>
    name=(pattern2)
    age=(pattern2.1)
    company=(pattern2.2)
</tag_2>

<tag_3>
    name=(pattern3)
    age=(pattern3.1)
    company=(pattern3.2)
</tag_3>
</tags>
"""
from xml.etree import ElementTree
document = ElementTree.fromstring(xml_content)

您可以遍历标签并获得所需的信息:

for tag in document:
    print(tag.tag)
    print(tag.text)
    print(tag.text.split())
    print(dict(line.split('=') for line in tag.text.split()))
    print("---------------------")

它输出:

tag_1

    name=(pattern1)
    age=(pattern1.1)
    company=(pattern1.2)

['name=(pattern1)', 'age=(pattern1.1)', 'company=(pattern1.2)']
{'name': '(pattern1)', 'age': '(pattern1.1)', 'company': '(pattern1.2)'}
---------------------
tag_2

    name=(pattern2)
    age=(pattern2.1)
    company=(pattern2.2)

['name=(pattern2)', 'age=(pattern2.1)', 'company=(pattern2.2)']
{'name': '(pattern2)', 'age': '(pattern2.1)', 'company': '(pattern2.2)'}
---------------------
tag_3

    name=(pattern3)
    age=(pattern3.1)
    company=(pattern3.2)

['name=(pattern3)', 'age=(pattern3.1)', 'company=(pattern3.2)']
{'name': '(pattern3)', 'age': '(pattern3.1)', 'company': '(pattern3.2)'}

如果你想要一个大列表或一个大字典:

def tag_to_dict(tag):
    return dict(line.split('=') for line in tag.text.split())

[tag_to_dict(tag) for tag in document]

{tag.tag:tag_to_dict(tag) for tag in document}

返回:

[{'name': '(pattern1)', 'age': '(pattern1.1)', 'company': '(pattern1.2)'},
 {'name': '(pattern2)', 'age': '(pattern2.1)', 'company': '(pattern2.2)'},
 {'name': '(pattern3)', 'age': '(pattern3.1)', 'company': '(pattern3.2)'}]

{'tag_1': {'name': '(pattern1)',
  'age': '(pattern1.1)',
  'company': '(pattern1.2)'},
 'tag_2': {'name': '(pattern2)',
  'age': '(pattern2.1)',
  'company': '(pattern2.2)'},
 'tag_3': {'name': '(pattern3)',
  'age': '(pattern3.1)',
  'company': '(pattern3.2)'}}

【讨论】:

  • 感谢@Eric Duminil 付出的努力和时间,但我希望字典格式为 tag1 = {pattern1 : {age : pattern1.1, company : pattern1.2}} tag2 ={pattern2:{年龄:pattern2.1,公司:pattern2.2}} tag3 ={pattern3:{年龄:pattern3.1,公司:pattern3.2}}
  • @user3101632 和最后两个对象非常接近您想要的格式。它们仍然可以转换为您想要的,无需正则表达式或复杂的逻辑。当列表可以时,您不需要 n 个变量。
  • 谢谢,我会探索python中的'XML'模块
猜你喜欢
  • 2023-03-19
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多