[英]list to dictionary conversion with multiple values per key?
我有一個包含鍵/值對的 Python 列表:
l = [[1, 'A'], [1, 'B'], [2, 'C']]
我想將列表轉換為字典,其中每個鍵的多個值將聚合成一個元組:
{1: ('A', 'B'), 2: ('C',)}
迭代解決方案很簡單:
l = [[1, 'A'], [1, 'B'], [2, 'C']]
d = {}
for pair in l:
if pair[0] in d:
d[pair[0]] = d[pair[0]] + tuple(pair[1])
else:
d[pair[0]] = tuple(pair[1])
print(d)
{1: ('A', 'B'), 2: ('C',)}
這個任務有更優雅的 Pythonic 解決方案嗎?
from collections import defaultdict
d1 = defaultdict(list)
for k, v in l:
d1[k].append(v)
d = dict((k, tuple(v)) for k, v in d1.items())
d
現在包含{1: ('A', 'B'), 2: ('C',)}
d1
是一個以列表為值的臨時 defaultdict,它會在最后一行轉換為元組。 通過這種方式,您將附加到列表而不是在主循環中重新創建元組。
使用列表而不是元組作為字典值:
l = [[1, 'A'], [1, 'B'], [2, 'C']]
d = {}
for key, val in l:
d.setdefault(key, []).append(val)
print(d)
使用普通字典通常比defaultdict
更可取,特別是如果您只構建一次,然后在稍后的代碼中繼續讀取它:
首先,普通字典的構建和訪問速度更快。
其次,更重要的是,如果您嘗試訪問不存在的密鑰,而不是靜默創建該密鑰,那么后面的讀取操作將出錯。 一個普通的字典讓你在你想要創建一個鍵值對時顯式地聲明,而defaultdict
總是隱式地創建它們,在任何類型的訪問中。
這種方法相對高效,而且相當緊湊:
reduce(lambda x, (k,v): x[k].append(v) or x, l, defaultdict(list))
在 Python3 中,這變為(使導出顯式):
dict(functools.reduce(lambda x, d: x[d[0]].append(d[1]) or x, l, collections.defaultdict(list)))
請注意,reduce 已轉移到 functools,並且 lambda 不再接受元組。 此版本在 2.6 和 2.7 中仍然有效。
鍵是否已在輸入列表中排序? 如果是這種情況,您有一個功能性解決方案:
import itertools
lst = [(1, 'A'), (1, 'B'), (2, 'C')]
dct = dict((key, tuple(v for (k, v) in pairs))
for (key, pairs) in itertools.groupby(lst, lambda pair: pair[0]))
print dct
# {1: ('A', 'B'), 2: ('C',)}
我創建了一個值列表,如下所示:
performance_data = driver.execute_script('return window.performance.getEntries()')
然后我不得不將數據(名稱和持續時間)存儲在具有多個值的字典中:
dictionary = {}
for performance_data in range(3):
driver.get(self.base_url)
performance_data = driver.execute_script('return window.performance.getEntries()')
for result in performance_data:
key=result['name']
val=result['duration']
dictionary.setdefault(key, []).append(val)
print(dictionary)
我的數據在 Pandas.DataFrame 中
myDict = dict()
for idin set(data['id'].values):
temp = data[data['id'] == id]
myDict[id] = temp['IP_addr'].to_list()
myDict
給了我一個鍵、ID、映射到 >= 1 IP_addr的字典。 第一個 IP_addr 是有保證的。 即使temp['IP_addr'].to_list() == []
我的代碼也應該工作
{'fooboo_NaN': ['1.1.1.1', '8.8.8.8']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.