簡體   English   中英

使用列表推導構建以列表為值的字典

[英]Building a dictionary with lists as values using list comprehension

我正在嘗試使用list/dict comprehension來簡化以下代碼,其中我想從列表中構建列表字典。

在此示例中,我將每個項目的 mod(或任何其他功能)作為鍵。 如果字典中不存在該鍵,則創建一個新列表並將該項目附加到列表中,否則直接附加該項目。

def get_key(val):
    return val % 3 # Can be something else, it doesn't matter


dict = {}
data = [i for i in range(10)]
for item in data:
    key = get_key(item)
    if key in dict:
        dict[key].append(item)
    else:
        dict[key] = [item]
print(dict)

預期 output

{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

為了簡化上面的代碼,我嘗試了這種丑陋的方法:

for item in data:
    key = get_key(item)
    dict[key] = [item] if key not in dict else (dict[key], dict[key].append(item))[0]

但是,如何在沒有 for 循環的情況下使用list/dict 理解作為單個表達式來實現相同的目標?

我可以想到這樣的事情,但它無法將 append 值放入預先存在的列表中。

{get_key(item):[item] for item in data}

相關文章:

你很親密。 下面是我使用字典理解的方法

data = list(range(0,10))
mod= 3
{i:data[i::mod] for i in range(mod)}

出去

{0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

創建一個值列表,每個子列表的第一個元素是鍵,即[n] + ,然后使用它來創建字典。

m = [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]

dictt = {i[0]:i[1:] for i in m}
print(dictt)

>>> {0: [0, 3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8]}

全部在一條線上

dictt = {i[0]:i[1:] for i in [[n] + [i[1] for i in [(x%3,x) for x in range(10)]if i[0] == n] for n in range(3)]}

您在這里並不需要列表/字典理解。 只需使用帶有defaultdict的普通循環:

out = collections.defaultdict(list)
for i in range(10):
    out[i % 3].append(i)

嘗試默認 dict

from collections import defaultdict

d = defaultdict(list)
for item in range(10): 
    d[item % 3].append(item)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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