![](/img/trans.png)
[英]dict.setdefault appends one extra (default?) item into the value list
[英]Convert list with one item to item itself in dict value
例如,有一個包含鍵值對的字典,其中的值是具有不同“內容”的列表。 有些列表只有一個元素。 這些元素可以是不同類型的數據。
問題:將具有一個元素的列表類型鍵值轉換為字典值中的元素本身的最有效方法是什么?
輸入數據
{
"key1": ["text"],
"key2": ["text", "text"],
"key3": [{"key0": 0}],
"key4": [{"key0": 0, "key1": 1}],
"key5": [],
"key6": [[]],
"key7": [["text"]],
"key8": [[{"key0": 0}]]
}
預期output數據
{
"key1": "text",
"key2": ["text", "text"],
"key3": {"key0": 0},
"key4": {"key0": 0, "key1": 1},
"key5": "",
"key6": "",
"key7": "text",
"key8": {"key0": 0}
}
我試過的
{k: v[0] for k, v in dct.items()}
我的代碼的 Output 以及問題和評論
{
'key1': 'text',
'key2': 'text', <- ISSUE 1 should be ["text", "text"]
'key3': {'key0': 0},
'key4': {'key0': 0, 'key1': 1},
'key5': <- ISSUE 2 Raises ERROR "IndexError: list index out of range" which is quite expected, should be ""
'key6': [], <- ISSUE 3 should be ""
'key7': ['text'], <- ISSUE 4 should be "text"
'key8': [{'key0': 0}] <- ISSUE 5 should be {'key0': 0}
}
將Input data
中的字典轉換為Expected output data
中的字典的最有效方法是什么?
為了解決這個問題,我專注於如何轉換值:我創建一個名為delist
的 function 來刪除包含 1 個元素的列表:
def delist(value):
while isinstance(value, list) and len(value) == 1:
value = value[0]
if value == []:
value = ""
return value
希望邏輯很容易理解。 使用它:
data = {
"key1": ["text"],
"key2": ["text", "text"],
"key3": [{"key0": 0}],
"key4": [{"key0": 0, "key1": 1}],
"key5": [],
"key6": [[]],
"key7": [["text"]],
"key8": [[{"key0": 0}]]
}
new_data = {k: delist(v) for k, v in data.items()}
new_data
是
{'key1': 'text',
'key2': ['text', 'text'],
'key3': {'key0': 0},
'key4': {'key0': 0, 'key1': 1},
'key5': '',
'key6': '',
'key7': 'text',
'key8': {'key0': 0}}
這是使用np.ravel()的單行代碼
d = {
"key1": ["text"],
"key2": ["text", "text"],
"key3": [{"key0": 0}],
"key4": [{"key0": 0, "key1": 1}],
"key5": [],
"key6": [[]],
"key7": [["text"]],
"key8": [[{"key0": 0}]]
}
out = {k: list(np.ravel(v)) if np.ravel(v).size>1 else (np.ravel(v)[0] if np.ravel(v).size==1 else '') for k,v in d.items()}
Output:
{'key1': 'text',
'key2': ['text', 'text'],
'key3': {'key0': 0},
'key4': {'key0': 0, 'key1': 1},
'key5': '',
'key6': '',
'key7': 'text',
'key8': {'key0': 0}}
也許不是最優雅的(實際上很丑陋)但可以解決問題,以防萬一我不會收到更聰明的東西。
# input data
dct = {
"key1": ["text"],
"key2": ["text", "text"],
"key3": [{"key0": 0}],
"key4": [{"key0": 0, "key1": 1}],
"key5": [],
"key6": [[]],
"key7": [["text"]],
"key8": [[{"key0": 0}]]
}
# define function
def delist(dct):
new_dct = {}
for k, v in dct.items():
if v:
if len(v) > 1:
new_dct[k] = v
else:
if v[0]:
if type(v[0])==list:
new_dct[k] = v[0][0]
else:
new_dct[k] = v[0]
else:
new_dct[k] = ""
else:
new_dct[k] = ""
return new_dct
# apply function to input data
delist(dct)
退貨
{
'key1': 'text',
'key2': ['text', 'text'],
'key3': {'key0': 0},
'key4': {'key0': 0, 'key1': 1},
'key5': '',
'key6': '',
'key7': 'text',
'key8': {'key0': 0}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.