2016-12-13 4 views
0

У меня возникли проблемы с получением данных из словаря, созданного в цикле for. В моем коде у меня есть два словаря, созданных и обновляемых периодически, один из машинной базы данных и один из глобальной базы данных. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно оценить каждую из них в отдельном для цикла на основе номера машины. Я не могу создать словари без проблем, но я борюсь с кодом, чтобы получить другой тег словаря на итерацию цикла for.Вызов данных из словаря, созданного в цикле for в python

Это код, который создает словари:

# sets machines that need error checking performed 
workcenters = ['25294', '25296', '25331', '25334', '25335', '25336'] 

# Queries local machine database 
for index in range(len(workcenters)): 
    result = EEDBConnect.connect(workcenters[index]) 
    globals()["a" + str(workcenters[index])] = result 

# Returns a different dictionary for each machine in the form of: 
a25294 = {'Line_Status':None, 'Order_ID':None} 
a25296 = {'Line_Status':None, 'Order_ID':None} 
a25331 = {'Line_Status':None, 'Order_ID':None} 
ect.... 
ect.... 

# Queries global machine database 
for index in range(len(workcenters)): 
    result = GBDBConnect.connect(workcenters[index]) 
    globals()["b" + str(workcenters[index])] = result 

# Returns a different dictionary for each machine in the form of: 
b25294 = {'Line_Status':None, 'Order_ID':None} 
b25296 = {'Line_Status':None, 'Order_ID':None} 
b25331 = {'Line_Status':None, 'Order_ID':None} 
ect.... 
ect.... 

Теперь часть я имею проблемы с, как я могу идти о поиске этих словарей в цикле? Ниже приведен пример кода, который я пытаюсь сделать.

(я знаю, что это совершенно неправильный путь, чтобы написать это, но я не могу найти лучший способ, чтобы описать это)

****** ****** Обновлено

for index in range(len(workcenters)): 
    a = #here is where i need to assign the a##### dictionary 
    b = #here is where i need to assign the b##### dictionary 

    stat[str(workcenters[index])] = a['Line_Status'] == b['Line_Status'] 
    ordr[str(workcenters[index])] = a['Order_ID'] == b['Order_ID'] 

Я пробовал несколько способов получить желаемый результат, и я застрял в этой проблеме около недели. Я уверен, что это что-то действительно глупое, что мне не хватает, но я начал писать питон в этом году для этого проекта, и любая помощь будет очень признательна. Благодаря!

+4

Почему, почему бы вы когда-нибудь сделать что-то вроде этого: 'глобалам() [ "а" + ул (обрабатывающие центры [индекс])] = result' ??? –

+1

Но оставляя это в стороне, ваш вопрос очень хорош для первого вопроса, но было бы лучше, если бы вы описали, какой результат вы получаете с вашей попыткой, и как это отличается от результата, который вы ищете. –

+1

Кроме того, просто подсказка, в python, вы можете в основном перебирать элементы в контейнере напрямую. поэтому вместо 'for index in range (len (some_list))' вы можете сделать 'для элемента в some_list:' –

ответ

0

Предполагается, что вы хотите сохранить словари, созданные во втором цикле for с префиксом b, так как вы, похоже, используете их таким образом, как видно из кода последнего цикла.

И там лежит ваша проблема, потому что, как видно из текущего кода, вы не создадите не переменные с префиксом b:

# Queries global database 
for index in range(len(workcenters)): 
    result = GBDBConnect.connect(workcenters[index]) 
    globals()["b" + str(workcenters[index])] = result # originally 'a' + ... 

Кроме того, избежать использования globals. Хотя это может выглядеть легко и весело, использование словаря для хранения ваших динамических переменных будет лучше, проще и безопаснее.

machine_results = {} 
... 
machine_results["b" + str(workcenters[index])] = result 

P.S. В последнем цикле

if a['Line_Status'] == b['Line_Status']: 
    result = True 
if a['Line_Status'] != b['Line_Status']: 
    result = False 

может быть сведено к

result = a['Line_Status'] == b['Line_Status'] 
+0

Да, вы правы, это была простая ошибка с копией папок. Я торопился. Спасибо за лучшую форматированную строку результатов. Это отлично работает. – Andrew

0

Это ужасный способ делать вещи. Вместо хранения автоматически создаваемых элементов в рабочем пространстве globals(), где также выходят многие другие переменные, просто сохраняйте их в специально созданных пространствах имен. Другими словами, сохраните переменные a* в одном dict (например, a, возможно?) И ваши b* переменные в другом dict (возможно, это называется b?). При этом два самих dict могут быть глобальными переменными. Я не думаю о том, что переменная абсолютно имеет, как a1234, в отличие от a[1234] (или a['1234'], в зависимости от того, что имеет больше смысла).

Если вы необходимо присвоить переменные непосредственно в globals(), что простительно, если и только если психопат имеет пистолет к голове и настаивает на этом, то проблема просто одна из Перебор словаря и отбрасывая ключи, которые не соответствуют ожидаемому соглашению (или обрабатывают только те, которые делают). Это может быть сделано следующим образом:

import re 
for name, value in globals().items(): 
    if re.match(r'a[0-9]+', name): 
     print 'found an a* variable:', name, value 

    if re.match(r'b[0-9]+', name): 
     print 'found a b* variable:', name, value 
+0

вот почему я спрашиваю экспертов .... Спасибо за совет. – Andrew

Смежные вопросы