Несколько вопросов. Во-первых, если вы пытаетесь создать справочную таблицу, словари - это путь. Однако ваши ключи должны быть уникальными, а ваши - нет. Вы перезапишете значения в вашем единственном словаре.
Давайте начнем с того, что приведем данные в структуру пары ключ-значение. Ваши ключи ограничены (насколько я могу судить) alarm
, job
и machine
. Поскольку ваши ключи не соответствуют тому, что находится в структуре данных, вам, вероятно, придется жестко их кодировать. Мы будем использовать предоставленную вами структуру данных в качестве отправной точки:
things = ['', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.026Z', 'Message: LivePnL:in live pricing', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:01.016Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.994Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.956Z', 'Message: Risk request failed', '', '', 'Application name: Clarion.Pricing.Grid.Service', 'Source: EC2AMAZ-ITEJKDI', 'Timestamp: 2019-01-23T22:00:00.927Z', 'Message: Risk request failed', '', '', '', 'For instructions please see: https://protect-eu.mimecast.com/s/2_5sC864NHV0NWin7Cr2?domain=wiki', '']
apps, source, messages = [], [], []
# I want to iterate over each element in things
for element in things:
# Now, each element has one of two possibilities, an empty string or key-value
# I will skip the empties like so
if not element:
continue
# Now I will split on ': ' since I don't want a leading space in values
k, v = element.split(': ')
# And we match on the keys here
if k=='Application name':
apps.append(v)
elif k=='Source':
sources.append(v)
elif k=='Message':
messages.append(v)
else:
print(k)
Получает все значения в связанные списки, которые мы можем zip
вместе для простой итерации.
apps
# ['Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service', 'Clarion.Pricing.Grid.Service']
sources
# ['EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI', 'EC2AMAZ-ITEJKDI']
messages
# ['LivePnL:in live pricing', 'Risk request failed', 'Risk request failed', 'Risk request failed', 'Risk request failed']
Теперь, чтобы построить структуру данных (вот документы для zip
:
lookups = []
# zip is putting the lists side-by-side so to speak for easy iteration
for app, src, msg in zip(apps, sources, messages):
lookups.append({'alarm': app,
'job': src,
'machine': msg})
Полученная структура данных выглядит следующим образом:
[{'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'LivePnL:in live pricing'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}, {'alarm': 'Clarion.Pricing.Grid.Service', 'job': 'EC2AMAZ-ITEJKDI', 'machine': 'Risk request failed'}]
Каждая запись в lookup
теперь представляет собой dictionary
с клавишами тревоги, задания и машины. Вы можете get
каждое значение итеративно, вот так:
for entry in lookup:
print('alarm: %s'%entry.get('alarm'))
... # continue for other keys
Примечание. Я использую метод get
вместо entry['alarm']
, это более надежный поиск, в котором не используется KeyErrors
и вместо него возвращается значение по умолчанию (None
, если не указано) .
Определенно, есть более быстрые и лаконичные способы сделать это, но я думаю, что этого достаточно, чтобы все выглядело знакомо и не утомляло вас новыми концепциями