发送数据到python中的两个列表项

时间:2018-11-15 15:25:50

标签: python string python-2.7 dictionary defaultdict

Python脚本:

msg = """
Device: Main1
ID: 1111
status: OK

Device: Main1
ID: 2222
Status: OK

Device: Main2
ID: 3333
status: OK

Device: Main2
ID: 4444
Status: OK
"""
main1_id = []
main2_id = []

for line in msg.split("\n"):
    if  line.startswith("ID:"):
        main1_id.append(line)
print main1_id
print main2_id

我有味精可变数据。如果设备分别是Main1和Main2,我想将此数据的ID添加到两个不同的列表main1_idmain2_id中。 我试图在上面的代码中实现这一点。我陷入困境,需要帮助。

输出:

['ID: 1111', 'ID: 2222', 'ID: 3333', 'ID: 4444']
[]

预期输出:

['ID: 1111', 'ID: 2222']
['ID: 3333', 'ID: 4444']

2 个答案:

答案 0 :(得分:0)

使用字典

您应尝试避免以这种方式创建可变数量的变量。在这里您可以使用collections.defaultdict

from collections import defaultdict

dd = defaultdict(list)
L = msg.split('\n')

for idx, line in enumerate(L):
    if line.startswith('Device'):
        dd[line.split(': ')[-1]].append(int(L[idx+1].split(': ')[-1]))

结果:

defaultdict(list, {'Main1': [1111, 2222],
                   'Main2': [3333, 4444]})

然后通过dd['Main1']dd['Main2']访问您的列表。

答案 1 :(得分:0)

您可能希望使用defualtdict和基本语法解析器来处理此问题。通过使用正则表达式和集合,我可以顺其自然地节省一些时间。如果文件语法不好,则此代码也会发出错误,这是一件好事。

import collections 
ids = collections.defualtdict(list)
line_regex = r"(\w*): *(\w*)"

for line in input.split():

    if not line.strip(): 
        continue

    key, value = re.match(line_regex, line).groups()
    if key == 'Device':
        cur_device = value
    if key == 'ID' and cur_device is not None:
        ids[cur_device].append(value)
        cur_device = None
    if key == 'ID' and cur_device is None:
        raise SyntaxError('Could not parse input')