Форматирование строк с перестановками значений словаря

1

Вот что я сейчас имею:

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 меняются местами во второй строке строки.

Что было бы эффективным способом обойти эту часть?

Благодарю.

Теги:

1 ответ

1
Лучший ответ

Вы можете использовать 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 если этот порядок имеет значение для вас.

  • 0
    Хм, это ничего не делает. Если я распечатаю combos после того, как вы его определили, это пустой список.
  • 0
    Является ли final[2]['MPID'] правильной целью для вашей работы?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню