2015-07-23 3 views
1

У меня есть следующий список списков dicts:Вывести список списков dicts в Python

l = [[{'close': 'TRUE'}], [{'error': 'FALSE'}], [{'close': 'TRUE', 'error': 'TRUE'}, {'close': 'TRUE', 'error': 'FALSE'}]] 

, и я хотел бы напечатать его таким образом:

(close = TRUE) & (error = FALSE) & ((close = TRUE & error = TRUE) | (close = TRUE & error = FALSE)) 

На данный момент, у меня есть следующие функции, которые почти сделать работу:

def pretty_string(l): 
    print ' & '.join('({0})' 
         .format(' | ' 
           .join('({0})' 
             .format(' & ' 
               .join('{0} = {1}' 
                .format(key, value) 
                for key, value 
                in disjuncts.items())) 
             for disjuncts 
             in conjuncts)) 
         for conjuncts 
         in l) 

Но это дает мне:

((close = TRUE)) & ((error = FALSE)) & ((close = TRUE & error = TRUE) | (close = TRUE & error = FALSE)) 

Обратите внимание на дополнительные круглые скобки вокруг «(close = TRUE)» и «(error = FALSE)».

Как их можно удалить?

ответ

0

Просто используйте оператор if для изменения формата строки (('({0})' if len(disjuncts) > 1 else '{0}')) в зависимости от длины вашего внутреннего списка. Пример:

def pretty_string(l): 
    print ' & '.join(
     '({0})'.format(
      ' | '.join(
       ('({0})' if len(disjuncts) > 1 else '{0}').format(
        ' & '.join(
         '{0} = {1}'.format(key, value) for key, value in disjuncts.items() 
        ) 
       ) for disjuncts in conjuncts 
      ) 
     ) for conjuncts in l 
    ) 
0
def conv(item): 
    if(isinstance(item, dict)): 
     yield '(' + ' & '.join("{} = {}".format(*i) for i in item.items()) + ')' 
    elif(isinstance(item, list)): 
     for i in item: 
      for s in conv(i): 
       yield s 

def pretty_string(l):                          
    return ' | '.join(conv(l)) 
Смежные вопросы