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

sending data to two list items in python

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']

使用字典

您应该尽量避免以这种方式创建可变数量的变量。这里可以使用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'] 访问您的列表。

您可能需要一个 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')