我從這本詞典開始:
lower_to_upper = {"a": ["A", "B"],
"b": ["B", "C"]}
然后,我將所有大寫字母放在一個串列中并列印該串列...
upper_list = [upper for lo_uppers in lower_to_upper.values() for upper in lo_uppers]
print(f"upper_list: {upper_list}")
...正如預期的那樣:
upper_list: ['A', 'B', 'B', 'C']
接下來,我根據大寫字母串列創建兩個字典。一個值為零的值 ( upper_to_count) 和另一個空串列的值是它的值 ( upper_to_lower):
upper_to_count = dict.fromkeys(upper_list, 0)
upper_to_lower = dict.fromkeys(upper_list, [])
接下來,我想讓它upper_to_count包含原始字典中出現的大寫字母的條目數。同樣,我想upper_to_lower用小寫字串填充 - 現在 - 空串列,它們是相應大寫字母的鍵。
for i, upper_list in enumerate(lower_to_upper.values()):
lower = list(lower_to_upper.keys())[i]
for upper in upper_list:
upper_to_count[upper] = 1
upper_to_lower[upper].append(lower)
結果upper_to_count如預期。但結果upper_to_lower并不如(I)預期的那樣。這些說法...
print(f"upper_to_count: {upper_to_count}")
print(f"upper_to_lower: {upper_to_lower}")
... 列印:
upper_to_count: {'A': 1, 'B': 2, 'C': 1}
upper_to_lower: {'A': ['a', 'a', 'b', 'b'], 'B': ['a', 'a', 'b', 'b'], 'C': ['a', 'a', 'b', 'b']}
我的期望是這樣的:
print(f"upper_to_lower_exp: {upper_to_lower_exp}")
upper_to_lower_exp: {'A': ['a'], 'B': ['a', 'b'], 'C': ['b']}
這是一本看起來像這樣的字典:
upper_to_lower_exp = {'A': ['a'],
'B': ['a', 'b'],
'C': ['b']}
我不明白為什么我得到upper_to_lower而不是upper_to_lower_exp。我不知道是什么產生了輸出upper_to_lower而不是upper_to_lower_exp?
我為我的問題標題的奇怪而道歉。非常感謝您提前提供任何幫助!
uj5u.com熱心網友回復:
當并行迭代鍵和值時,最佳實踐是使用.items:
lower_to_upper = {"a": ["A", "B"],
"b": ["B", "C"]}
upper_to_lower_exp = {}
for key, values in lower_to_upper.items():
# iterate over each value
for value in values:
# if no key has been created so far for the value create one
if value not in upper_to_lower_exp:
upper_to_lower_exp[value] = []
# append the key to the list of the corresponding value
upper_to_lower_exp[value].append(key)
# upper_to_count is just upper_to_lower_exp but with the length of the lists instead
upper_to_count = {k: len(vs) for k, vs in upper_to_lower_exp.items()}
print(upper_to_count)
print(upper_to_lower_exp)
輸出
{'A': 1, 'B': 2, 'C': 1}
{'A': ['a'], 'B': ['a', 'b'], 'C': ['b']}
uj5u.com熱心網友回復:
不確定您是如何初始化upper_to_lower字典的,但是如果像這樣初始化,您的代碼可以正常作業:
# `list(set(upper_list))` being ['A', 'B', 'C']
upper_to_lower = {k: [] for k in list(set(upper_list))}
for i, upper_list in enumerate(lower_to_upper.values()):
lower = list(lower_to_upper.keys())[i]
for upper in upper_list:
upper_to_count[upper] = 1
upper_to_lower[upper].append(lower)
輸出:
{'B': ['a', 'b'], 'A': ['a'], 'C': ['b']}
uj5u.com熱心網友回復:
我找到了答案。在官方檔案中,關鍵的花絮是初始化字典的值“只參考一個實體”——是那個None或例如一個空串列。因此,當我將元素附加到這個串列時,最終字典中的所有鍵都將指向同一個串列。
classmethod fromkeys ( iterable [, value ]) 使用 iterable 中的鍵和值設定為值創建一個新字典。
fromkeys() 是一個回傳新字典的類方法。值默認為無。所有的值都只參考一個實體,因此將值作為可變物件(例如空串列)通常沒有意義。要獲得不同的值,請改用字典理解。(在此處輸入鏈接描述)
我不知道。非常感謝提供的答案!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/348932.html
上一篇:轉置二維串列并將其轉換為一維串列
