2017-07-14 31 views
0

考虑下面从一个txt文件中读取行:的Python 3 - 让使用字符开始/结束点的线条对象

编辑:文本文件有上千行,就像下面这样的: TAG1 = 1494947148,1,d,BLE,0,2,0,0 & TAG2 [] = 0,229109531800552 & TAG2 [] = 0,22910953180055 ...

在线会有一些数据对应到TAG1和大量的数据有&TAG2在他们的开始。

我想要有内进一步字典词典,像

{ 
    {'TAG1':1494947148,1,d,ble,0,2,0,0} 
    {'TAG2: 
    {'1': 0, '2':229109531800552} 
    {'1': 0, '2':22910953180055} 
    } 
    . 
    . 
} 

如何拆分开始TAG1TAG2之前停止之前的符号串? python是否允许某种方式来检查是否遇到某个或某些特定字符并停止/开始?

+0

你的问题不清楚。请给出一个完整的输入文件和所需的输出来封装您的问题。请参见[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。请明确陈述您的假设。 “TAG1”之后的字符是否等于等号? “TAG2”之前的角色肯定会是&符号吗?这些字符可能在文件中有其他用途吗?等等。 –

+0

@RoryDaulton请参阅编辑。 – omrakhur

+0

将列表的列表存储为字典值是有意义的。使用字典的值没有明显的优势。您使用数字作为字典的关键字,与使用索引和列表没有多大区别。 – frogcoder

回答

1

我会将它们变成字符串键和值列表的字典。不管标签是否有一个或多个项目,只要列表可以简化它们。如果您觉得有必要,您可以进一步处理结果字典。

该代码将放弃标签名称中的[],因为它们都转向列表。

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} 

最后一行使用两个列表和字典理解的东西。我们想把结果变成标签和值列表的字典。花括号是字典理解。内部变量tv是从tag_values中提取的,其中t是标记,而v是分组匹配值(包括再次标记)。在大括号的开始处t:表示使用t作为字典键,该列将作为键的匹配值。

我们希望将字典值转换为列表列表。方括号是消耗可迭代的v的列表理解并将其变成列表。变量c代表v中的每个项目,最后因为c有两个项目,标记和字符串值,通过使用c[1].split(',')我们取值部分并将其右分成一个列表。并有你的结果。

进一步阅读

你真的应该熟悉list/dict comprehensiongenerator expression,如果你还想要得到与Python做更多的事情,在yield看一看,学itertools,functools,运营商沿途。基本上只是函数式编程的东西,python不是一个纯粹的函数式语言,但这些只是你可以使用的一些强大的隐喻。阅读一些功能语言,如haskell,这也可以提高你的python技能。

+0

这很好,但是有一个小问题:对于'TAG1',代码工作正常,但对于'TAG2',它将所有v列表一起加入到一个大列表中。 – omrakhur

+0

@omrakhur我修改了代码,希望这就是你想要的。每个项目都是列表的列表。 – frogcoder

+0

太好了!你能解释一下像我这样的新手的结果吗?谢谢! – omrakhur

1

我认为这可能你需要什么:

import json 
data = "TAG1=1494947148,1,d,ble,0,2,0,0&TAG2[]=0,229109531800552&TAG2[]=0,22910953180055" 
items = data.split("&") 
res ={} 
for item in items: 
    key, value = item.split("=") 
    key = key.replace("[]","") 
    values = value.split(",") 
    if key in res: 
     res[key].append(values) 
    else: 
     res[key] = [values] 
print(res) 
print(json.dumps(res)) 

结果:

{'TAG1': [['1494947148', '1', 'd', 'ble', '0', '2', '0', '0']], 
'TAG2': [['0', '229109531800552'], ['0', '22910953180055']]} 
{"TAG1": [["1494947148", "1", "d", "ble", "0", "2", "0", "0"]], 
"TAG2": [["0", "229109531800552"], ["0", "22910953180055"]]} 
0

这可能有助于你

string = 'TAG1=1494947148,1,d,ble,0,2,0,0&TAG2[]=0,229109531800552' 
data = map(str,string.split('&')) 
print data 
in_data_dic= {} 
for i in data: 
    in_data = map(str,i.split('=')) 
    in_data_dic[in_data[0]] = in_data[1] 
    in_data=[] 

print in_data_dic 

output 
{'TAG2[]': '0,229109531800552', 'TAG1': '1494947148,1,d,ble,0,2,0,0'} 
相关问题