為了練習如何使用字典變得更流利,我嘗試撰寫一個程式來讀取月球大氣的化學成分,并將元素及其估計成分分配為這樣的鍵值對 "NEON 20":40000
資料檔案看起來像這樣
Estimated Composition (night, particles per cubic cm):
Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000
Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000
Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000
到目前為止,我的代碼如下所示:
def read_data(filename):
dicti = {}
with open(filename,"r") as infile:
infile.readline()
for line in infile:
words = line.split(";")
dicti[words[0]] = f"{words[1]}"
for key in dicti:
print(key, dicti[key])
read_data("atm_moon.txt")
我的問題是:
- 我如何在
"-"和上拆分";"? - 我如何從這個資料檔案中以簡單而優雅的方式將元素及其估計的大氣成分分配為鍵值對?
- 如何使元素名稱全部大寫?
有沒有好心人幫個菜鳥出手?歡迎所有幫助。
uj5u.com熱心網友回復:
你這里有一個行串列。每行可以包含多個專案,用分號分隔。每個專案(或記錄)由元素名稱、連字符和粒子陣列成。
您不需要在此處同時拆分不同的分隔符;相反,您可以使用分號拆分單個專案,然后根據連字符將每個專案拆分為您的字典所需的鍵/值對。
for line in infile:
for item in line.split(" ; "):
key, value = item.split(" - ", 1)
dicti[key.upper()] = value
請注意,我將分隔符周圍的空格包括在內,因此在拆分時它們會被洗掉。否則,這些最終會出現在您的字典中。另一種方法是使用strip(); 這樣即使那里有更多(或沒有)空間,它也能正常作業。
for line in infile:
for item in line.split(";"):
key, value = item.split("-", 1)
dicti[key.strip().upper()] = value.strip()
但是,如果您的一個記錄中可能有分號或連字符而不是分隔符,我會在.split()呼叫中留下空格。
現在我將更進一步,假設您希望這些值作為實際數字,而不僅僅是字串。為此,我們將洗掉逗號并將它們轉換為整數。
for line in infile:
for item in line.split(";"):
key, value = item.split("-", 1)
dicti[key.strip().upper()] = int(value.strip().replace(",", ""))
如果有任何帶有小數部分(小數點)的值,您可以使用float()代替int()將它們轉換為浮點數。
uj5u.com熱心網友回復:
我覺得使用 Python REPL 來測驗這個更容易。
$ python
>>> string = """\
Estimated Composition (night, particles per cubic cm):
Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000
Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000
Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000\
"""
>>> lines = string.split('\n')
>>> lines
['Estimated Composition (night, particles per cubic cm):', 'Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000', 'Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000', 'Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000']
>>> lines[1:]
['Helium 4 - 40,000 ; Neon 20 - 40,000 ; Hydrogen - 35,000', 'Argon 40 - 30,000 ; Neon 22 - 5,000 ; Argon 36 - 2,000', 'Methane - 1000 ; Ammonia - 1000 ; Carbon Dioxide - 1000']
>>> [line.split(' ; ') for line in lines[1:]]
[['Helium 4 - 40,000', 'Neon 20 - 40,000', 'Hydrogen - 35,000'], ['Argon 40 - 30,000', 'Neon 22 - 5,000', 'Argon 36 - 2,000'], ['Methane - 1000', 'Ammonia - 1000', 'Carbon Dioxide - 1000']]
>>> [line.split(' - ') for line in lines[1:] for line in line.split(' ; ')]
[['Helium 4', '40,000'], ['Neon 20', '40,000'], ['Hydrogen', '35,000'], ['Argon 40', '30,000'], ['Neon 22', '5,000'], ['Argon 36', '2,000'], ['Methane', '1000'], ['Ammonia', '1000'], ['Carbon Dioxide', '1000']]\
最后,使用所需的映射創建一個字典物件:
>>> dict([line.split(' - ') for line in lines[1:] for line in line.split(' ; ')])
{'Helium 4': '40,000', 'Neon 20': '40,000', 'Hydrogen': '35,000', 'Argon 40': '30,000', 'Neon 22': '5,000', 'Argon 36': '2,000', 'Methane': '1000', 'Ammonia': '1000', 'Carbon Dioxide': '1000'}
要根據需要轉換鍵值對(即通過大寫字典中的所有鍵并將所有值轉換為int),您可以使用輔助函式來轉換鍵值對,如下所示:
>>> transform = lambda x, y: (x.upper(), int(y.replace(',', '')))
>>> dict([transform(*name_line.split(' - ')) for line in lines[1:] for name_line in line.split(' ; ')])
{'HELIUM 4': 40000, 'NEON 20': 40000, 'HYDROGEN': 35000, 'ARGON 40': 30000, 'NEON 22': 5000, 'ARGON 36': 2000, 'METHANE': 1000, 'AMMONIA': 1000, 'CARBON DIOXIDE': 1000}
uj5u.com熱心網友回復:
要按多個分隔符拆分,有正則運算式:Split Strings into words with multiple word boundary delimiters
或者您可以先替換所有分隔符以僅保留一種型別,然后使用 .split()
我不確定你想如何用它制作字典,但你總是可以回圈遍歷新創建的串列,并一個一個地分配它(或使用生成器)。如果你包括字典應該是什么樣子,我可以提供一個例子。
要將字串更改為大寫,請使用:
"abc".upper()
# ABC
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322839.html
