2013-11-28 63 views
1

我有以下代碼:元組重排的Python

check = open(a, 'r') 
line =check.readlines() 
for items in line: 
    breakup= items.split() 
    length = (len(breakup)-1) 
    number[0], salary[1], position[2], oname[3:length], first[-1] = breakup 
    data.append(tuple([first, oname, number, position, salary])) 

這個代碼塊從具有通用的信息,例如文本文件讀取:

15674 24000 Manager Gregory the 1st John 

我試圖使用for循環將信息追加到我詢問的順序中的數據中,以便將上述信息顯示爲:

('John', 'Gregory the 1st', 15674, 'Manager', 24000) 

原因我已經從位置3切片到倒數第二的位置是oname可以是任意數量的名稱,但是名字將永遠是一個項目,所以我100%確定我可以從位置[-1]調用它

問題我有它是不工作。代碼將正確讀取文件並正確分解它,但是我無法正確重新排列它。

+3

除非'number','salary'等是列表,分配將不起作用。我相信你不明白這裏的元組賦值。 –

+0

饋入的項目在列表中,我將它分配到元組列表中,供我稍後打印和修改。如果你問我,我的工作很愚蠢! – Softey

回答

5

你需要以不同的分割你的線,然後分配部分沒有指數和切片賦值:

number, salary, position, rest = items.split(None, 3) 
oname, first = rest.rsplit(None, 1) 
data.append((first, oname, number, position, salary)) 

這將保留在oname領域的空間。第一次呼叫只分3次,給你前三個字段和一個餘數。然後將rest中的剩餘部分從右邊的分開一次,給出onamefirst

演示:

>>> items = '15674 24000 Manager Gregory the 1st John\n' 
>>> number, salary, position, rest = items.split(None, 3) 
>>> oname, first = rest.rsplit(None, 1) 
>>> first, oname, number, position, salary 
('John', 'Gregory the 1st', '15674', 'Manager', '24000') 
+0

這似乎是更乾淨的方式來做到這一點,像夢一樣運作。非常感謝! – Softey

2

這個怎麼樣?它將每一行分成令牌,然後將每個令牌放在適當的位置。你正在做的事情 - 你應該索引令牌列表,而不是你想要分配給它們的變量。這假定「經理」將不包含空格 - 否則,經理和姓名將不明確。

data = [] 
with open(a,r) as f: 
    for lines in f: 
     toks = lines.split() 
     data.append((toks[-1], toks[3:-1], int(toks[0]), toks[2], int(toks[1]))) 

這將使一個單詞列表,而不是一個空格在其中的字符串。如果您希望它是一個字符串,只需將toks[3:-1]替換爲" ".join(toks[3:-1])即可。

+0

這使得'oname'列表;我懷疑OP希望有一個空格仍然存在的字符串。 –

+0

好點。我會編輯注意到這一點。 – amaurea