簡體   English   中英

列表到字典轉換,每個鍵有多個值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM