2013-04-30 4 views
1

Я пишу псевдокод, где я хочу, чтобы следующие два цикла «для» повторялись до тех пор, пока все ключи в data_changes и modem_changes не будут такими же, то есть не должно быть никаких ключей, которые представляют data_changes, но а не в modem_changes и наоборот. После этого я смогу написать реализацию Python; может ли кто-нибудь предоставить исходные данные? EDITED:Управляющий поток для циклов

утра больше интересует

  1. как позвонить func1 и func2 для ключей, которые присутствуют в одном, а не другой

2.repeating для петель, пока ключи не будут то же самое в data_changes и modem_changes

data_changes = { 
    '253036': [''], 
    '313115': ['313113'] 
    } 

modem_changes = {'305403': [], 
       '311957': ['253036', '312591'] 
       } 

s1 = set(data_changes.keys()) 
s2 = set(modem_changes.keys()) 
value1 = s2.difference(s1) 
print value1 
value2 = s1.difference(s2) 
print value2 

def func1 (data_changes,key): 
    if key == '311957': 
     output = '' 
    if key == '305403': 
     output = '' 
     return output 

def func2 (modem_changes,key): 
    if key == '313115': 
     output ='' 
    if key == '253036': 
     output='' 
    return output 

def method(d1, f1, d2, f2): 
    s1 = set(d1.keys()) 
    s2 = set(d2.keys()) 
    for k in s2.difference(s1):#set(['311957', '305403']) 
     f1(d1, k) # k in d2 not in d1. 
    for k in s1.difference(s2):#set(['313115', '253036']) 
     f2(d2, k) # k in d1 not in d2. 

while(True): 
    method(data_changes, func1, modem_changes, func2) 
    value = set(data_changes.keys()) - set(modem_changes.keys()) 
    print value 
    if value == set([]): 
     break; 


EXPECTED OUTPUT:- 

data_changes = { 
    '253036': [''], 
    '313115': ['313113'] 
    '305403':[''] 
    '311957':[''] 
    } 

modem_changes = {'305403': [], 
       '311957': ['253036', '312591'] 
       '253036':[] 
       '313115':[] 
       } 
+0

@Mike - это не только пересечение двух наборов. Есть намного больше, я пытаюсь .. более смущенно о потоке управления о том, как это может быть достигнуто. – user2125827

+0

'data_changes.update (modem_changes)' ;-) –

+0

@ LennartRegebro - что делает обновление? – user2125827

ответ

1
In [8]: keys = set(data_changes.keys()) & set(modem_changes.keys()) 

In [9]: data_changes = {k:data_changes[k] for k in keys} 

In [10]: modem_changes = {k:modem_changes[k] for k in keys} 

In [11]: data_changes 
Out[11]: {'253036': ['']} 

In [12]: modem_changes 
Out[12]: {'253036': ['311957', '312994', '312591']} 
+0

меня больше интересует 1.calling func1 и func2 для ключей, которые присутствуют в одном, а не в другом. 2. Повторение циклов for до тех пор, пока ключи не будут одинаковыми в data_changes и modem_changes. – user2125827

+0

@ user2125827: Вы все равно можете использовать эту технику. Например, 'set (data_changes.keys()) - set (modem_changes.keys())' даст вам ключи, найденные в 'data_changes', но не в' modem_changes'. – NPE

+0

.. спасибо .. это решит мою проблему # 1 .. как продолжать повторять две петли «для», пока ключи не будут одинаковыми в data_changes и modem_changes, т. Е. Никаких изменений нет в одном, а не в другом. .if не так ... другой лучший способ реализовать? – user2125827

0

Попробуйте сделать следующее, чтобы повторение для петель:

while(True): 
    for key in data_changes: 
     if key not in modem_changes: 
      func1() 
    for key in modem_changes: 
     if key not in data_changes: 
      func2() 
    if(True): #logic to check wether to run for loops again 
     break; 
0

Поскольку вы не объяснили, что именно вы имеете в виду под «клавиши такие же» я буду считать, что func1 и func2 функции, которые вы уже писали и использовать они в моем ответе как таковые. Я также предполагаю, что функции принимают словарь/ключ, над которым они работают. Если это не так, вы всегда можете изменить его в своем коде.

def method(d1, f1, d2, f2): 
    s1 = set(d1.keys()) 
    s2 = set(d2.keys()) 
    for k in s2.difference(s1): 
     f1(d1, k) # k in d2 not in d1. 
    for k in s1.difference(s2): 
     f2(d2, k) # k in d1 not in d2. 

выше метод принимает аргументы в следующем виде, иллюстрированные вашими примерами:

method(data_changes, func1, modem_changes, func2) 

Если вы имеете в виду, что все ключи, которые не являются в обоих словарях должны быть удалены, то один следующего кода:

def keep_similar(d1, d2): 
    '''creates new dicts from shared keys''' 
    shared_keys = set(d1.keys()).intersection(set(d2.keys())) 
    r1 = dict((k, d1[k]) for k in shared_keys) 
    r2 = dict((k, d2[k]) for k in shared_keys) 
    return (r1, r2) 

def eliminate_diffs(d1, d2): 
    '''removes non-shared keys from dicts''' 
    s1 = set(d1.keys()) 
    s2 = set(d2.keys()) 
    for k in s2.difference(s1): 
     del d2[k] 
    for k in s1.difference(s2): 
     del d1[k] 
    return (d1, d2) 

Просто выберите тот, который наиболее подходит Если у вас мало подобных ключей, используйте первый, если у вас несколько не похожих ключей, а затем используйте второй.

+0

Помните, что 's2.difference (s1) == s2 - s1' и' s1.intersection (s2) == s1 & s2' – Eric

+0

@Inbar Rose - «ключи имеют то же значение» ... любой ключ, присутствующий в одном должен присутствовать в другом ... количество ключей должно быть одинаковым и равным .. не должно быть в одном порядке – user2125827

+0

@ user2125827 Да, но должны ли ключи быть добавлены или удалены? Если добавлено, какие значения они должны иметь? –

Смежные вопросы