python - Добавлять значения добавляются несколько раз в список, когда я добавляю только - PullRequest
0 голосов
/ 03 ноября 2018
from itertools import permutations, product


def sensitivity_analysis(a,b):
    length_a=len(a.keys())
    length_b=len(b.keys())
    items_a=list(a.keys())
    items_b=list(b.keys())
    a_variants = [dict(zip(items_a, values)) 
                 for values in product((list(p) for p in permutations(items_b)), repeat=length_a)]
    b_variants = [dict(zip(items_b, values)) 
                 for values in product((list(v) for v in permutations(items_a)), repeat=length_b)]

    all_variants = product(a_variants, b_variants)
    contains_a=[]
    contains_b=[]
    for i,j in all_variants:
        contains_a.append(i)
        contains_b.append(j)
    return contains_a,contains_b

def insert_dummies(a,b):
  length_a=len(a.keys())
  length_b=len(b.keys())
  items_a=list(a.keys())
  items_b=list(b.keys())
  dummy_list=[]
  if length_a>length_b:
    dummy_number=length_a-length_b
    nummer=1
    while nummer<dummy_number+1:
        dummy_list.append("Dummy%d" %nummer)
        nummer=nummer+1
    for i in items_a:
      f=0
      while dummy_number>f:
        a.setdefault(i,[]).append(dummy_list[f])
        f=f+1
    n=0    
    while n<(dummy_number):
      for z in dummy_list:
        b[z]=items_a
        n=n+1
  if length_a<length_b:
    dummy_number=length_b-length_a
    nummer=1
    while nummer<dummy_number+1:
        dummy_list.append("Dummy%d" %nummer)
        nummer=nummer+1
    for i in items_b:
      f=0
      while dummy_number>f:
        b.setdefault(i,[]).append(dummy_list[f])
        f=f+1
    n=0    
    while n<(dummy_number):
      for z in dummy_list:
        a[z]=items_b
        n=n+1
    else:
        return

  return a,b

ab={"kart":["marie","alice"],
"vinod":["alice","marie"],
"jordan":["marie","alice"],
"joe":["marie","alice"]}
ba={"alice":["kart","vinod","joe","jordan"],
"marie":["kart","vinod","jordan","joe"]}

thelist1=sensitivity_analysis(ab,ba)[0]
thelist2=sensitivity_analysis(ab,ba)[1]
insert_dummies(thelist1[0],thelist2[0])

У меня здесь две функции. Одним из них является sens__alalysis, который возвращает все возможные комбинации двух словарей ab и ba. Функция insert_dummies предназначена для выравнивания обоих словарей путем добавления манекенов. Например, приведенный выше словарь должен выглядеть следующим образом после добавления макетов.

{'kart': ['marie', 'alice', 'Dummy1', 'Dummy2'],
  'vinod': ['alice', 'marie', 'Dummy1', 'Dummy2'],
  'jordan': ['marie', 'alice', 'Dummy1', 'Dummy2'],
  'joe': ['marie', 'alice', 'Dummy1', 'Dummy2']},
 {'alice': ['kart', 'vinod', 'joe', 'jordan'],
  'marie': ['kart', 'vinod', 'jordan', 'joe'],
  'Dummy1': ['kart', 'vinod', 'jordan', 'joe'],
  'Dummy2': ['kart', 'vinod', 'jordan', 'joe']}

Но в этом случае фиктивная 1 и фиктивная 2 добавляются 4 раза для каждого ключа в словаре ab. Также thelist1 и thelist2 добавляются с манекенами. Что я здесь не так делаю? Любая помощь приветствуется!

1 Ответ

0 голосов
/ 04 ноября 2018

Проблема заключалась в том, что я как-то создавал словарь с ключами, указывающими на один и тот же список, а не на четыре равных списка. Это означает, что у меня меняется одно значение, все остальные тоже меняются (на самом деле это просто один объект).

Я исправил это, изменив структуру словаря, чтобы иметь разные значения для значений.

newdic1 = {k:v[:] for k, v in list1[i].items()} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...