【问题标题】:Parsing a string for data sets解析数据集的字符串
【发布时间】:2013-09-25 11:30:25
【问题描述】:

我有一个长字符串,其中包含需要分离/提取以进行评估的信息集。

作为一名初学者程序员,我知道各种解析操作,例如 split() append() remove() 等 - 但我正在努力想出一种将它们组合起来以提取相关数据的逻辑方法......

长字符串...

"<Sets X="s"><B s="1" e="2176" t="-2.0774E4" r="1" /><B s="2177" e="8982" t="-1.8597E4" r="1" /><B s="8983" e="10393" t="-150.22" r="1" /></Sets>"

包含3组需要存储为浮点值的数据

[Set1] s=1 e=2176 t=-20774 r=1

[Set2] s=2177 e=8982 t=-18597 r=1

[Set3] s=8983 e=10393 t=-150.2 r=1

我希望将每组数据存储为一个列表

Set1 = [1,2176,-20774,1]
Set2 = [2177,8982,-18597,1]
Set3 = [2178,10393,-150.2,1]

注意:套数可以变化

【问题讨论】:

  • 理想的解决方案只涉及“numpy”库

标签: python string parsing


【解决方案1】:

使用内置的ElementTree库从xml中提取数据:

import xml.etree.ElementTree as ET


data = '<Sets X="s"><B s="1" e="2176" t="-2.0774E4" r="1" /><B s="2177" e="8982" t="-1.8597E4" r="1" /><B s="8983" e="10393" t="-150.22" r="1" /></Sets>'

tree = ET.fromstring(data)
for b in tree.findall('.//B'):
     print map(float, itemgetter(*'setr')(b.attrib))

打印:

[1.0, 2176.0, -20774.0, 1.0]
[2177.0, 8982.0, -18597.0, 1.0]
[8983.0, 10393.0, -150.22, 1.0]

【讨论】:

  • 我会让你的打印更好,并使用operator.itemgetter - 例如:map(float, itemgetter(*'set')(b.attrib))(但将吸气剂移到更合适的地方)
  • 干杯 - 理想情况下,我不想再导入任何库(除了 numpy)另外,上面代码中的输出列表是如何命名的?因为可能有任意数量的集合,他们需要分配 list1、list2 等...
  • 好吧,Python 的力量来自于导入适当的库——无论它们是内置的(例如xmloperator 还是第3 方numpy)...没有人在他们的权利头脑会尝试使用正常的str 操作来解析你的字符串......这会很痛苦,冗长,容易中断,让人们想对你做坏事:) @PeteLavelle
  • 难怪我在想出一种用正常操作解析字符串的逻辑方法时遇到了麻烦......
  • 我想知道为什么我们没有一个特别的 Jon Clements 的徽章来发布很棒的 cmets :)
【解决方案2】:

注意:这是对先前答案的扩展...

(@alecxe 和 @Jon Clements 的道具)

为了标记每个数据集并以易于访问的格式存储结果

import xml.etree.ElementTree as ET
import operator

data = '<Sets X="s"><B s="1" e="2176" t="-2.0774E4" r="1" /><B s="2177" e="8982" t="-1.8597E4" r="1" /><B s="8983" e="10393" t="-150.22" r="1" /></Sets>'

dataDictionary = {}

tree = ET.fromstring(data)
setNumber = 0

for b in tree.findall('.//B'):
    setNumber = setNumber + 1
    dataSet = map(float, operator.itemgetter(*'setr')(b.attrib))
    dataDictionary[setNumber] = dataSet
    print "This is dataset " +str(setNumber)
    print dataSet

print ""
print "This is the Dictionary of datasets"
print dataDictionary

这会产生以下输出 - 这很容易用于未来的操作:)

This is dataSet 1
[1.0, 2176.0, -20774.0, 1.0]
This is dataSet 2
[2177.0, 8982.0, -18597.0, 1.0]
This is dataSet 3
[8983.0, 10393.0, -150.22, 1.0]

This is the dataDictionary
{1: [1.0, 2176.0, -20774.0, 1.0], 2: [2177.0, 8982.0, -18597.0, 1.0], 3: [8983.0, 10393.0, -150.22, 1.0]}

【讨论】:

  • burstNumber 来自哪里——应该是setNumber?我还建议 for startNumber, b in enumerate(tree.findall('.//B'), start=1) 是一种避免手动增加计数器的选项,使用 print 'This is dataset', burstNumber 可以避免看起来相当混乱的 str 调用
  • @JonClements - 你是对的,它应该是 setNumber。我更改了变量名称以使其通用,但错过了那个。现在编辑了,干杯...
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多