在Python

时间:2015-07-23 13:10:13

标签: python string list dictionary set

我有以下的词典列表:

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)”和“(错误= FALSE)”附近的额外括号。

如何删除这些内容?

2 个答案:

答案 0 :(得分: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
    )

答案 1 :(得分: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))