3 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個贊
使用re.search和collections.defaultdict:
import re
from collections import defaultdict
d = defaultdict(list)
with open('NameList.txt') as fw:
for line in fw:
code = re.search(' (\w{2})-', line).group(1)
nick = re.search('(\w{8}) +', line).group(1)
d[code].append(nick)
輸出:
defaultdict(list,
{'DE': ['THAUSKTR', 'KLERNMTT', 'BIRKNJHA', 'MALDESND'],
'HU': ['FODORGBR', 'ZSOLDPTE'],
'SK': ['KUROTADR', 'CANECVAD'],
'UK': ['WRIGHNIL']})

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個贊
首先拆分列表" "并用于operator.itemgetter迭代列表的最后一個元素。
或更換-1在itemgetter用3,如果國家代碼始終是列表中的第三個元素。
from operator import itemgetter
x = ["FODORGBR + HU-Szombathely-2","ZSOLDPTE + HU-Debrecen-3","THAUSKTR + DE-Herzogenaurach-1",
"WRIGHNIL + UK-SuttonColdfield-2","KUROTADR + SK-KysuckeNoveMesto-1","KLERNMTT + DE-Herzogenaurach-1",
"BIRKNJHA + DE-Erlangen-111","CANECVAD + SK-KysuckeNoveMesto-1","MALDESND + DE-Herzogenaurach-1"]
new_list = [i.split() for i in x]
new_list.sort(key=itemgetter(-1))
print([" ".join(i) for i in new_list])
輸出:
['BIRKNJHA + DE-Erlangen-111', 'THAUSKTR + DE-Herzogenaurach-1', 'KLERNMTT + DE-Herzogenaurach-1', 'MALDESND + DE-Herzogenaurach-1', '
ZSOLDPTE + HU-Debrecen-3', 'FODORGBR + HU-Szombathely-2', 'KUROTADR + SK-KysuckeNoveMesto-1', 'CANECVAD + SK-KysuckeNoveMesto-1', 'WRI
GHNIL + UK-SuttonColdfield-2']

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個贊
您用于查找國家/地區(qū)名稱的代碼看起來很好。處理文件時的一條建議:使用with- 語句而不是openand close。使用時open,在close調(diào)用之前的某個時間發(fā)生錯誤,可能是文件沒有正確關(guān)閉,這可能會搞砸各種事情。with無論相應(yīng)的代碼塊內(nèi)發(fā)生什么,都會關(guān)閉文件(它的工作原理類似于try - finally,請參閱上面的鏈接了解更多信息)。所以,像這樣:
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
...
確保該文件將始終關(guān)閉。順便說一句,line.find('+')您可以只使用,而不是使用line.split('+'),這會帶走整個字符串切片部分。
現(xiàn)在,對于您的問題:這里有幾種可能性可以使用。最簡單的方法是為每個國家/地區(qū)定義一個列表,并將相應(yīng)的名稱附加到正確的列表中:
de = []
hu = []
uk = []
sk = []
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
if not line_fw.strip():
continue
country = line_fw.split('+')[1].split('-')[0].strip()
nickname = line_fw.split('+')[0]
if country == 'DE':
de.append(nickname)
elif country == 'HU':
hu.append(nickname)
elif country == 'UK':
uk.append(nickname)
else:
sk.append(nickname)
這將返回每個國家/地區(qū)的列表,其中包含相應(yīng)的昵稱。但是,如您所見,這非常笨重且冗長。一個更優(yōu)雅的解決方案是使用以國家作為鍵和名稱列表作為值的字典:
d = {}
with open('NameList.txt', 'r') as fw:
for line_fw in fw:
if not line_fw.strip():
continue
country = line_fw.split('+')[1].split('-')[0].strip()
nickname = line_fw.split('+')[0].strip()
try:
d[country].append(nickname) # if country already exists in d, append the nickname
except KeyError:
d[country] = [nickname] # if country doesn't exist in d, make a new entry
這將創(chuàng)建一個看起來像這樣的字典(我只是用前幾行來說明它):
{'HU': ['FODORGBR', 'ZSOLDPTE'], 'DE': ['THAUSKTR'], 'UK': ['WRIGHNIL']}
現(xiàn)在,有更優(yōu)雅的提取國家和昵稱的解決方案,但其中一些已在其他答案中指出。
最后,如果我猜對了,您想將結(jié)果寫入新文件,或者至少打印它們。假設(shè)您有一個上述形式的字典。只需通過 迭代它的鍵for k in d:,在它們之間添加一些換行符 ( '\n') 并用于join將列表轉(zhuǎn)換為一個字符串,所有項目之間都帶有換行符:
for k in d:
print(k + ':\n' + '\n'.join(d[k]) + '\n')
這將打?。?/p>
HU:
FODORGBR
ZSOLDPTE
DE:
THAUSKTR
UK:
WRIGHNIL
通過添加with open(outputfile, 'w') as f:和更換print用f.write,你可以很容易地寫一個新的文件。
添加回答
舉報