我会将它们变成字符串键和值列表的字典。不管标签是否有一个或多个项目,只要列表可以简化它们。如果您觉得有必要,您可以进一步处理结果字典。
该代码将放弃标签名称中的[],因为它们都转向列表。
from itertools import groupby
from operator import itemgetter
import re
s = "TAG1=1494947148,1,d,ble,0,2,0,0&TAG2[]=0,229109531800552&TAG2[]=0,22910953180055"
splitted = map(re.compile("(?:\[\])?=").split, s.split("&"))
tag_values = groupby(sorted(splitted, key=itemgetter(0)), key=itemgetter(0))
result = {t: [c[1].split(',') for c in v] for t, v in tag_values}
当你打印结果,您可以:
print(result)
{'TAG2': [['0', '229109531800552'], ['0', '22910953180055']], 'TAG1': [['1494947148', '1', 'd', 'ble', '0', '2', '0', '0']]}
它是如何工作
splitted = map(re.compile("(?:\[\])?=").split, s.split("&"))
首先你&分割线。这会将线条变成像“TAG2 [] = 0,229109531800552”这样的小块,然后map将每个块变成两部分,从而在它们之间移除=或[] =。
tag_values = groupby(sorted(splitted, key=itemgetter(0)), key=itemgetter(0))
因为map
功能,分裂现在是一个迭代食用时,将返回的两个项目名单。我们进一步排序,然后用标签(=左边的字符串)对它们进行分组。现在我们有tag_values
,关键字代表标签,每个标签与所有匹配值(包括标签)配对。仍然是一个迭代,虽然,这意味着所有我们谈论还没有真正happend然而除了s.split("&")
result = {t: [c[1].split(',') for c in v] for t, v in tag_values}
最后一行使用两个列表和字典理解的东西。我们想把结果变成标签和值列表的字典。花括号是字典理解。内部变量t
和v
是从tag_values
中提取的,其中t
是标记,而v
是分组匹配值(包括再次标记)。在大括号的开始处t:
表示使用t
作为字典键,该列将作为键的匹配值。
我们希望将字典值转换为列表列表。方括号是消耗可迭代的v
的列表理解并将其变成列表。变量c
代表v
中的每个项目,最后因为c
有两个项目,标记和字符串值,通过使用c[1].split(',')
我们取值部分并将其右分成一个列表。并有你的结果。
进一步阅读
你真的应该熟悉list/dict comprehension和generator expression,如果你还想要得到与Python做更多的事情,在yield看一看,学itertools,functools,运营商沿途。基本上只是函数式编程的东西,python不是一个纯粹的函数式语言,但这些只是你可以使用的一些强大的隐喻。阅读一些功能语言,如haskell,这也可以提高你的python技能。
你的问题不清楚。请给出一个完整的输入文件和所需的输出来封装您的问题。请参见[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。请明确陈述您的假设。 “TAG1”之后的字符是否等于等号? “TAG2”之前的角色肯定会是&符号吗?这些字符可能在文件中有其他用途吗?等等。 –
@RoryDaulton请参阅编辑。 – omrakhur
将列表的列表存储为字典值是有意义的。使用字典的值没有明显的优势。您使用数字作为字典的关键字,与使用索引和列表没有多大区别。 – frogcoder