2013-05-02 22 views
0

我有以下的,需要對蟒蛇implementation..I一些指導明確記載的算法和預期output..any輸入真正的讚賞..解析字典鍵和值和寫入/數據附加到文件

data_changes ={'305403': ['302180'], '312994': ['311957'], '311957': ['312621'] } 
modem_changes = {'305403': [], '313113': [], '312994': ['253036', '312591'], '311957': []} 

for keys that are present in both data_changes and modem_changes: 
     write data to a file "file.txt" in the order key-->data_changes_values-->modem_changes_values 

for keys that exist in only one of data_changes and modem_changes : 
     append data to the same file "file.txt" key--> data_changes_values or key-->modem_changes values 

EXPECTED OUTPUT:- 

Create a text file with the following data 

305403 302180 
312994 311957 253036 312591 
311957 312621 
313113 

以下是我的嘗試,但不是我的服務宗旨......

build_dep_list= [i 
for k, v in itertools.chain.from_iterable(d.iteritems() for d in (data_changes, modem_changes)) 
for i in [k] + (v or []) 
if i] 
print "BUILD LIST" 
print list(set(build_dep_list)) 

CURRENT OUTPUT:- 
['305403', '302180', '313113', '311957', '312621', '253036', '312994', '312591'] 
+1

設置鍵的集合,然後你可以很容易地得到交集和對稱的差異等等:http://docs.python.org/2/library/stdtypes.html#set然後只需寫入文件。 – Patashu 2013-05-02 03:02:39

回答

0

的for循環可以寫成:

with open('file.txt', 'r') as f: 
    dc_keys = data_changes.keys() 
    mc_keys = modem_changes.keys() 

    for key in dc_keys: 
     if key not in modem_changes.keys(): continue 
     f.write('key-->' + ','.join(data_changes[key]) + '-->' + ','.join(modem_changes[key]) + '\n') 

    for key in mc_keys:  
     if key in dc_keys: continue 
     f.write('key-->' + ','.join(modem_changes[key])) 

    for key in dc_keys:  
     if key in mc_keys: continue 
     f.write('key-->' + ','.join(data_changes[key]))  

我已更新答案,只使用列表,因爲這樣更符合您的需求。至於文件編寫,我已經更新了它,以便它實際寫入文件。

+0

謝謝...如何寫入該錯誤的文件?很抱歉python非常新 – user2341103 2013-05-02 03:06:37

+0

第二個循環有一個問題,因爲你不知道鑰匙在哪兩個字母中。(我猜你可以嘗試兩個並找出,但它似乎很傻!) – Patashu 2013-05-02 03:06:40

+0

由戈利!你是對的。 – 2013-05-02 03:08:25

1

使用set小號......他們將有效地完成十字路口和對稱差的辛勤工作:

data_changes = {'305403': ['302180'], '312994': ['311957'], '311957': ['312621'] } 
modem_changes = {'305403': [], '313113': [], '312994': ['253036', '312591'], '311957': []} 

dc_set = set(data_changes) 
mc_set = set(modem_changes) 

# open a file in append mode  
fh = open('myfile.txt', 'a') 

for key in dc_set.intersection(mc_set): 
    union_values = data_changes[key] + modem_changes[key] 
    fh.write('%s,%s\n' % (key, ','.join(union_values))) 

for key in dc_set.symmetric_difference(mc_set): 
    dc_values = data_changes.get(key) or [] 
    mc_values = data_changes.get(key) or [] 
    union_values = dc_values + mc_values 
    fh.write('%s,%s\n' % (key, ','.join(union_values))) 

fh.close() 

http://docs.python.org/2/library/sets.html

第一個是相當簡單的,因爲按鍵在兩種類型的字典。在另一種情況下,你不知道密鑰將存在哪個字典。 get方法將嘗試獲取給定密鑰的值,如果未找到則返回None。如果未找到,它將默認爲or語句中的空列表。

+0

我通常使用:'dict.get(key,default)',即'data_changes.get(key,[])' – fileoffset 2013-05-02 03:55:52

+0

@brianz - 無論如何我們可以很容易地修改上面的代碼將輸出寫入文本文件「file.txt」(當文件不存在時創建文件) – user2341103 2013-05-02 06:41:02

+0

我已經更新了寫入文件的答案。你可以閱讀更多關於Python中讀寫文件的內容:http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files – brianz 2013-05-02 17:57:21