代码之家  ›  专栏  ›  技术社区  ›  Harrison

使用字典值的排列进行字符串格式化

  •  1
  • Harrison  · 技术社区  · 6 年前

    以下是我目前拥有的:

    from collections import defaultdict
    
    output = [{'MPID': 'A', 'CLIENTNAME': 'AAA'},
              {'MPID': 'C', 'CLIENTNAME': 'BBB'},
              {'MPID': 'C1', 'CLIENTNAME': 'CCC'},
              {'MPID': 'C2', 'CLIENTNAME': 'CCC'},
              {'MPID': 'C3', 'CLIENTNAME': 'CCC'}]
    
    d = defaultdict(list)
    
    for item in output:
        d[item['CLIENTNAME']].append(item['MPID'])
    
    final = [{'CLIENTNAME': k, 'MPID': v} for k, v in d.items()]
    print final
    

    此输出合并 MPID 匹配值 CLIENTNAMES .

    输出:

    [{'MPID': ['A'], 'CLIENTNAME': 'AAA'}, 
     {'MPID': ['C'], 'CLIENTNAME': 'BBB'}, 
     {'MPID': ['C1', 'C2', 'C3'], 'CLIENTNAME': 'CCC'}]
    

    我现在要做的是用每个mpid的所有置换格式化一个字符串,但前提是字典包含的mpid超过1。(在本例中,只有CCC的MPID大于1)。

    以下是我正在格式化的查询:

    query = '''x = '{}' and y = '{}' union 
               x = '{}' and y = '{}';'''
    

    此查询需要将所有MPID相互比较。期望的输出是:

    '''x = 'C1' and y = 'C2' union 
       x = 'C2' and y = 'C1';'''
    
    '''x = 'C2' and y = 'C3' union 
       x = 'C3' and y = 'C2';'''
    
    '''x = 'C1' and y = 'C3' union 
       x = 'C3' and y = 'C1';'''
    

    如您所见,x和y值交换字符串第二行中的位置。

    有什么方法可以有效地完成这一部分?

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Zev    6 年前

    你可以使用 combinations itertools

    from itertools import combinations
    
    combos = list(combinations(final[2]['MPID'], 2))
    combos.sort(key=lambda x: x[1])
    for combo in combos:
        a, b = combo
        print '''x = '{}' and y = '{}' union 
                   x = '{}' and y = '{}';'''.format(a, b, b, a)
    

    印刷品:

    x = 'C1' and y = 'C2' union 
                   x = 'C2' and y = 'C1';
    x = 'C1' and y = 'C3' union 
                   x = 'C3' and y = 'C1';
    x = 'C2' and y = 'C3' union 
                   x = 'C3' and y = 'C2';
    

    你可能需要调整 sort key 如果这个命令对你很重要的话。