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_id
和main2_id
中。
我试图在上面的代码中实现这一点。我陷入困境,需要帮助。
输出:
['ID: 1111', 'ID: 2222', 'ID: 3333', 'ID: 4444']
[]
预期输出:
['ID: 1111', 'ID: 2222']
['ID: 3333', 'ID: 4444']
答案 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')