Вот что я сейчас имею:
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, но ТОЛЬКО, если словарь содержит более 1 MPID. (в этом примере только CCC имеет более 1 MPID).
Вот запрос, который я форматирую:
query = '''x = '{}' and y = '{}' union
x = '{}' and y = '{}';'''
Этот запрос должен сравнивать все MPIDS друг с другом. Желаемый результат:
'''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 меняются местами во второй строке строки.
Что было бы эффективным способом обойти эту часть?
Благодарю.
Вы можете использовать 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';
Вам может потребоваться настроить key
sort
если этот порядок имеет значение для вас.
combos
после того, как вы его определили, это пустой список.final[2]['MPID']
правильной целью для вашей работы?