第 5 行和第 6 行有什么區別?第 5 行引發錯誤,但第 6 行有效。我無法理解其中的區別。
with open("file1.txt") as f:
lines = f.readlines()
for line in lines:
print(line)
print(dict(line.split('=', 1))) # Line 5 throwing ValueError: dictionary update sequence element #0 has length 1; 2 is required
print(dict(line.split('=', 1) for line in lines)) # Line 6 works fine
uj5u.com熱心網友回復:
假設我們有如下的值lines:
lines = ["foo=bar", "baz=ola"]
在這段代碼中:
print(dict(line.split('=', 1) for line in lines))
to 的引數dict是兩個元素的串列的可迭代,類似于:
>>> dict([["foo", "bar"], ["baz", "ola"]])
{'foo': 'bar', 'baz': 'ola'}
在這段代碼中:
for line in lines:
print(dict(line.split('=', 1)))
我們dict()多次呼叫,每次都帶有兩個元素的串列,類似于:
>>> dict(["foo", "bar"])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required
“字典更新序列元素#0”是"foo";每個“序列元素”都是一個鍵值對,因此發生錯誤是因為dict()試圖將其解釋"foo"為一對。由于您的錯誤訊息指示“長度 1”,我猜您的檔案中有一個單字符名稱,類似地被解釋為一對。
如果我們使用雙字符的字串,它會“作業”,但它會通過使用第一個字符作為鍵和第二個字符作為值來作業:
>>> line = "ab=xy"
>>> dict(line.split("="))
{'a': 'b', 'x': 'y'}
關鍵要點是 to 的引數dict必須是所有的鍵值對,而不是單個鍵值對——即它必須是一個生成器、串列或其他包含其他每個恰好兩個元素的迭代的迭代。即使您只有一對,您也必須將該對放在一個可迭代的(例如串列)中,因為dict()將始終將其引數視為對的可迭代。
uj5u.com熱心網友回復:
這是答案:
如果沒有給出位置引數,則創建一個空字典。如果給定位置引數并且它是映射物件,則使用與映射物件相同的鍵值對創建字典。否則,位置引數必須是可迭代物件。可迭代物件中的每個專案本身必須是恰好具有兩個物件的可迭代物件。每個專案的第一個物件成為新字典中的鍵,第二個物件成為相應的值。
在第 6 行中,您有一個迭代器,其專案是具有兩個物件的可迭代物件。第 5 行只是一個包含兩個專案的串列。
uj5u.com熱心網友回復:
對于像這樣的檔案:
x=1
y=2
z=3
使用類似下面的東西:
with open('f.txt') as f:
lines = f.read().splitlines() # strips newlines
new_dict = dict([line.split('=') for line in lines])
呼叫中dict的串列推導生成一個串列,其中串列的每個元素都是行的拆分組件。在這種情況下:
[['x', '1'], ['y', '2'], ['z', '3']]
該dict函式使用像這樣的迭代(元素由 2 個元素組成)作為鍵值對。
如果你檢查new_dict你會看到:
print(new_dict)
{'x': '1', 'y': '2', 'z': '3'}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/461286.html
下一篇:在資料框python中減去兩行值
