我有一個類似于以下的字典串列。實際資料包含任意多個鍵,這只是資料的一個示例:
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
我需要做的是訪問 name 和 age 鍵的值,并將它們作為一個串列,如下所示:
[['jamie', 'tara', 'matt'], [26, 43, 34]]
我知道如果我需要創建單個鍵的串列,我可以使用以下代碼列印它們的值:
[d["name"] for d in l]
但是,該代碼僅回傳以下輸出:
['jamie', 'tara', 'matt']
誰能幫助我如何將所有值作為串列回傳?另外,考慮到我的真實串列中會有很多鍵,是否可以以不需要指定鍵名的方式撰寫代碼?
uj5u.com熱心網友回復:
通過兩次使用串列推導,你可以獲得你想要的:
[[i['name'] for i in l], [i['age'] for i in l]]
更新
我的假設:
- 每個字典都有相同的鍵/值
- 你不想使用熊貓
我的方法是
- 從其中一個字典中獲取密鑰,第一個就可以了
>>> keys = l[0].keys() # key = ['name', 'age'] conceptually
- 將字典串列轉換為元組串列,其中每個元組包含值,按正確的順序:
>>> [[i[k] for k in keys] for i in l]
[['jamie', 26], ['tara', 43], ['matt', 34]]
- 給定這個元組串列,我可以使用 和 的組合
list來zip轉置它們:
>>> list(zip([[i[k] for k in keys] for i in l]))
[('jamie', 'tara', 'matt'), (26, 43, 34)]
這應該適用于所有字典,前提是它們具有相同的鍵。
uj5u.com熱心網友回復:
您可以使用zip:
l = [{'name': 'jamie', 'age': 26, 'hobby': 'fishing'},
{'name': 'tara', 'age': 43, 'hobby': 'soccer'},
{'name': 'matt', 'age': 34, 'hobby': 'knitting'}]
output = list(zip(*(dct.values() for dct in l))) # first method
print(output)
# [('jamie', 'tara', 'matt'), (26, 43, 34), ('fishing', 'soccer', 'knitting')]
keys = l[0].keys() # second method
output = list(zip(*([dct[k] for k in keys] for dct in l)))
print(output)
在這里,如果鍵的順序相同,則第一種方法有效(因此適用于 python 3.7 )。第二個有效,即使第二個 dict 是{'age': 43, 'name': 'tara', 'hobby': 'soccer'}.
uj5u.com熱心網友回復:
上面的 l 實作不起作用,但是如果你使用 'age' 而不是這樣的年齡
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
您可以像這樣創建兩個串列并遍歷每個字典。
names = []
ages = []
for d in l:
names.append(d['name'])
ages.append(d['age'])
names_ages = [names,ages]
names_ages 現在是 [['jamie', 'tara', 'matt'], [26, 43, 34]]
uj5u.com熱心網友回復:
首先,我必須修復您的dict輸入,因為age密鑰不是字串。下面迭代字典串列一次。
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
names = []
ages = []
for row in l:
names.append(row["name"])
ages.append(row["age"])
output = [names, ages]
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
我認為沒有串列理解它更具可讀性。
看到你不知道鑰匙的要求……
l = [{'name': 'jamie', 'age': 26},
{'name': 'tara', 'age': 43},
{'name': 'matt', 'age': 34}
]
from collections import defaultdict
value_lists = defaultdict(list)
for row in l:
for k, v in row.items():
value_lists[k].append(v)
# print(value_lists)
# if it must be list of lists
output = list(value_lists.values())
print(output)
# Output: [['jamie', 'tara', 'matt'], [26, 43, 34]]
uj5u.com熱心網友回復:
這將遍歷您的所有字典并編譯每個鍵的值。它不依賴于字典是否相同,也不依賴于排序。
from pprint import pprint
l = [{'name': 'jamie', 'age': 26, 'color': 'gold'},
{'name': 'tara', 'age': 43, 'hobby': 'archery'},
{'name': 'matt', 'age': 34, 'epic': 'louhi'}
]
def compile(ls):
dx = dict()
for d in ls:
for k, v in d.items():
current = dx.get(k, []) # Leverage get() default value option
current.append(v)
dx[k] = current
return dx
result = compile(l)
pprint(result)
這會產生輸出:
{'age': [26, 43, 34],
'color': ['gold'],
'epic': ['louhi'],
'hobby': ['archery'],
'name': ['jamie', 'tara', 'matt']}
如果需要,洗掉鍵很簡單:
only_values = [v for _, v in result.items()]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473205.html
