2013-04-30 80 views
1

我正在寫一個僞代碼,我希望重複下面兩個「for」循環,直到data_changes和modem_changes中的所有鍵都相同,即不應該存在任何存在data_changes的鍵,但是不在modem_changes中,反之亦然。我應該可以在這之後編寫Python實現;任何人可以提供投入? 編輯:for循環的控制流程

我更感興趣的

  1. 如何調用該存在於一個,而不是其他

2.repeating for循環,直到鍵鍵FUNC1和FUNC2在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 2013-04-30 05:56:57

+0

'data_changes.update(modem_changes)';-) – 2013-04-30 06:07:36

+0

@LennartRegebro - 更新有什麼作用? – user2125827 2013-04-30 06:09:56

回答

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.關鍵的func1和func2存在於其中一個而不是其他2.重複for循環,直到key_data_changes和modem_changes中的鍵相同 – user2125827 2013-04-30 06:02:47

+0

@ user2125827:您仍然可以使用此技術。例如,'set(data_changes.keys()) - set(modem_changes.keys())'會給你'data_changes'中找到的鍵,但不能在'modem_changes'中找到。 – NPE 2013-04-30 06:04:39

+0

..謝謝..這將解決我的問題#1 ..如何不斷重複兩個「for」循環,直到在data_changes和modem_changes中的鍵相同,即沒有更改是在一個而不是其他.. 。如果不是這種方式,其他更好的實現方式? – user2125827 2013-04-30 06:07:24

0

請嘗試以下方法不斷重複的for循環:

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

既然你沒有解釋究竟你的意思是「密鑰是相同的」我會認爲func1func2是你已經寫和使用的功能他們在我的答案中是這樣的。我還假設這些函數採用他們正在處理的字典/鍵。如果不是這種情況,您可以隨時在您的代碼中進行更改。

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 2013-04-30 07:24:09

+0

@Inbar Rose - 「鍵具有相同的含義」...任何鍵都存在於一個應該出現在其他...鍵的數量應該是相同的和相等的......必須是相同的順序 – user2125827 2013-04-30 07:24:49

+0

@ user2125827是的,但應該添加或刪除鍵?如果添加,他們應該具有什麼樣的價值? – 2013-04-30 07:25:22