1

我正在编写一个伪代码,我希望重复以下两个“for”循环,直到 data_changes 和 modem_changes 中的所有键都相同,即不应有任何键存在 data_changes 但 modem_changes 中不存在,反之亦然。在此之后我应该能够编写 Python 实现;任何人都可以提供输入吗?编辑:

我更感兴趣

  1. 如何为一个存在而不是另一个的键调用 func1 和 func2

2.重复 for 循环,直到 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':[] 
                 }
4

3 回答 3

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']}
于 2013-04-30T05:56:20.797 回答
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;
于 2013-04-30T06:15:05.043 回答
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) 

只需选择最适合您的情况的一个,如果您有几个相似的键,则使用第一个,如果您有几个不相似的键,则使用第二个。

于 2013-04-30T07:05:02.257 回答