2015-04-29 69 views
0

我從所謂的「ID2」的輸入文件,該文件是建立在這種格式閱讀與空間添加字符串字典的Python值(2.7)+排序

9 This 
6 This Is 
15 This Is The 
42 This Is The Word 

我想編寫一個腳本,將每行添加到自己的字典中(數字是關鍵字,任何後面的單詞都是該值)。目前,我的代碼僅適用於不包含空格的字符串(即僅適用於第一行「9 This」)。我收到的錯誤是'ValueError:解包太多的值'。

我還需要腳本來打印'key:value'結果(而不是字典本身)並將其按數字排序。我很確定我需要dict.keys和list.sort,但我不確定如何實現。下面是我的代碼至今:

d = {} 
with open("id2") as f: 
    for line in f: 
     (key, val) = line.split() 
     d[int(key)] = val 
print d 
+1

'將每行添加到自己的字典中' - 您是否試圖爲文件中的每一行創建一個新字典? – thefourtheye

+0

在python 3.x中,你可以使用擴展的iterable解包:https://www.python.org/dev/peps/pep-3132/例子:'key,* val = line.split()'雖然,我知道你在Python 2,所以這不適用:) – Shashank

回答

0

此實施方案解決您的問題。在line.split()中添加maxsplits參數將僅在一個位置中斷開該字符串。參數None將導致在數字和字符串之間刪除任何連續的空白。我添加了val.rstrip()來刪除行尾的換行符。最後我按鍵排序並打印出每個項目。

d = {} 
with open("id2") as f: 
    for line in f: 
     (key, val) = line.split(None, 1) 
     d[int(key)] = val.rstrip() 
for key in sorted(d): 
    print key, ':', d[key] 
6
key, value = string.split(line, maxsplit = 1) 
1

試試這個,

d = {} 
with open("id2") as f: 
    for line in f: 
     lst = line.split() 
     key, val = lst[0], " ".join(lst[1:]) 
     d[int(key)] = val 
print d 
+0

分裂,然後重新連接是不必要的...只是索引字符串 – jramm

0

要拆分的空間字符串(默認爲str.split)。您正嘗試將結果分配給2個值,但給定字符串的結果總是超過2個值。

如果字符串的第一個元素始終是一個數字,後面加一個空格,你可以這樣做:

key = int(line[0]) 
value = line[2:] 

(有沒有必要浪費一個函數調用來str.split打字..記住,一個字符串列表)

排序:

sorted(d) 

但你可能想保留訂購後排序,所以使用OrderedDict代替:

from collections import OrderedDict 
d_sorted = OrderedDict(sorted(d)) 
+0

'key = int(行[0])'會產生錯誤的關鍵,當數字更多比1位數。 –