我怎樣才能對literals或list的值使用字典理解呢?
現在我能夠遍歷一個嵌套的字典,并得到一個帶有嵌套值的dict作為結果,但是我想在輸出中包括dict、串列和字面意義(int, str)
下面是我的例子(我知道這里不需要isinstance)
nested_dict = {'first':{'a': 1}, 'second':{'b':2}, 'third': 3, 'fourth': [1, 2, 3, 4]}。
float_dict = {
outer_k: { float(inner_v)
for (inner_k, inner_v) in outer_v.items()}。
for (outer_k, outer_v) in nested_dict.items()
if isinstance(outer_v, dict)
}
print(float_dict)
預期輸出:
{'first': {'a': 1.0}, 'second': {'b': 2.0}, 'third': 3.0, ' fourth': [1. 0, 2.0, 3.0, 4.0]} 。
uj5u.com熱心網友回復:
使用單一的理解力是不可能的(合理的),你想要一個像這樣的遞回函式:
def floatify(v)。
if isinstance(v, list)。
return list(map(floatify, v))
if isinstance(v, dict)。
return {k: floatify(_v) for k, _v in v.items()} 。
return float(v)
>>> floatify(nested_dict)
{'first'/span>: {'a'/span>: 1.0}, 'second'/span>: {'b': 2.0}, 'third': 3.0, ' fourth': [1. 0, 2.0, 3.0, 4.0]} 。
注意,你可以讓這個函式變得更加通用:
def anyify(v, f)。
if isinstance(v, list)。
return [anyify(_v, f) for _v in v]
if isinstance(v, dict)。
return {k: anyify(_v, f) for k, _v in v.items()}。
return f(v)
anyify(nested_dict, float)
uj5u.com熱心網友回復:
或者在沒有遞回的情況下,你也可以用單執行緒來實作:
{outer_k: ({inner_k: float(inner_v) for(inner_k, inner_v) in outer_v.items()} if isinstance(outer_v, dict) else ([float(i) fori in outer_v] if isinstance(outer_v, list) else float(outer_v))) for (outer_k, outer_v) in nested_dict.items()}。
Ex:
nested_dict = {'first':{'a': 1}, 'second':{'b':2}, 'third': 3, ' fourth': [1, 2, 3, 4]}。
float_dict = {outer_k: ({inner_k: float(inner_v) for (inner_k, inner_v) in outer_v.items()} if isinstance(outer_v, dict) else ([float(i) fori in outer_v] if isinstance(outer_v, list) else float(outer_v))) for (outer_k, outer_v) in nested_dict.items()}。
print(float_dict)
輸出:
{'first'/span>: {'a'/span>: 1.0}, 'second': {'b': 2.0}, 'third': 3.0, ' fourth': [1. 0, 2.0, 3.0, 4.0]} 。
uj5u.com熱心網友回復:
這里有一個使用佇列的解決方案。通過利用dict和list的可變性,我們可以對這些物件(甚至是內部物件,甚至是多深的嵌套)進行enqueue,并且仍然能夠更新源資料。這將對資料的每個內部元素進行遍歷和輪詢。如果該元素是一個int,它將會把它轉換為float.
。import copy
nested_dict = {'first':{'a':1, 'second': {'b':2}, 'third': 3, '第四': [4, {"第五": 5}, 6, [{"第六": [7, 8]}, 9] , 10]}
float_dict = copy.deepcopy(nested_dict)
queue = [float_dict].
while queue:
data = queue.pop()
items = data.items() if isinstance(data, dict) else enumerate(data)
for key, value in items:
if isinstance(value, int)。
data[key] = float(value)
elif isinstance(value, (dict, list):
queue.append(value)
print(float_dict)
輸出
{'first'/span>: {'a'/span>: 1.0}, 'second': {'b': 2.0}, 'third': 3.0, 'fourth': [4.0, {'ifth': 5.0}, 6.0, [{' sixth': [7.0, 8.0]}, 9.0] , 10.0]}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/311629.html
標籤:
