簡體   English   中英

遍歷python字典中的列表

[英]Iterate through a list inside a dictionary in python

我對 Python 非常陌生,我需要創建一個函數,將字典中列表中的值除以 2:

dic = {"A":[2,4,6,8], "B":[4,6,8,10]}

所需的輸出:

dic2 = {"A":[1,2,3,4], "B":[2,3,4,5]}

我找到了這個帖子

python:遍歷具有列表值的字典

這有點幫助,但不幸的是我無法弄清楚示例代碼的“任何”部分。

我試過這個:

def divide(dic):
    dic2 = {}
    for i in range(len(dic)):
        for j in range(len(dic[i])):
            dic2[i][j] = dic[i][j]/2
    return dic2

我寫了不同的變體,但我一直在“for j...”行中收到 KeyError: 0 。

那是因為dict不像列表,它們不使用索引,它們使用鍵(如標簽),並且您可以使用dict.keys()來獲取dict的鍵。

或者,只需使用for in循環遍歷dict鍵:

dic = {"A": [2, 4, 6, 8], "B": [4, 6, 8, 10]}

for k in dic: # similar to `for key in dict.keys():`
    dic[k] = [x/2 for x in dic[k]]

print(dic)

輸出:

{'A': [1.0, 2.0, 3.0, 4.0], 'B': [2.0, 3.0, 4.0, 5.0]}

如果您不想要那個小數點,請使用//而不是/

看,領悟的力量:

>>> dic = {"A":[2,4,6,8], "B":[4,6,8,10]}
>>> dic2 = {k:[v/2 for v in vs] for k,vs in dic.items()}
>>> dic2
{'A': [1, 2, 3, 4], 'B': [2, 3, 4, 5]}

在外層有一個字典理解,還有一個“內部”列表理解,用於划分每個列表中的值。

您不一定能對字典進行數字迭代——您的range(len(dic)) (您也不應該以這種方式遍歷列表。)這就是dic[i]不起作用的原因——沒有dic[0] 相反,迭代它的鍵。

def divide(dic):
    dic2 = dic.copy()
    for key, value in dic:
        for i, _ in enumerate(value):  # Enumerate gives the index and value.
            dic2[key][i] = value[i]/2
    return dic2

誠然,理解是一種更好的方式,但這保留了你所做的事情的形式,並說明了問題所在。

要輕松迭代字典,請在字典中使用 for 鍵。 使用列表理解可以輕松地將列表一分為二

for k in dic1:
    dic1[k] = [x / 2 for x in dic1[k]]

以函數形式

def divdict(d):
    for k in d:
        d[k] = [x/2 for x in d[k]]

您必須使用它們的鍵訪問字典的元素。 在示例中,鍵是“A”和“B”。 您正在嘗試使用整數訪問字典,這會給您帶來范圍錯誤。

以下功能有效:

def divide_dic(dic):
    dic2 = {}

    # Iterate through the dictionary based on keys.
    for dic_iter in dic:

        # Create a copy of the dictionary list divided by 2.
        list_values = [ (x / 2) for x in  dic[dic_iter] ]

        # Add the dictionary entry to the new dictionary.
        dic2.update( {dic_iter : list_values} )

    return dic2

你可以用 lambda 來試試這個:

the_funct = lambda x: x/2

dic = {"A":[2,4,6,8], "B":[4,6,8,10]}

new_dict = {a:map(the_funct, b) for a, b in dic.items()}
## for Python 3.5
new_dict = {a:[*map(the_funct, b)] for a, b in dic.items()}

lambda 函數與 map 結合使用,它將在字典值中的每個元素上迭代函數。 通過使用 dict comprehension,我們可以將 lambda 應用於每個值。

我使用了上面 Wim 答案的細微變化(重點是使用key的理解):

dic = {"A":[2,4,6,8], "B":[4,6,8,10]}
dic2 = {k:[v/2 for v in dic[k]] for k in dic.keys()}

得到:

dic2
{'A': [1.0, 2.0, 3.0, 4.0], 'B': [2.0, 3.0, 4.0, 5.0]}

暫無
暫無

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

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