簡體   English   中英

將隨機鍵和值的列表轉換為字典

[英]Convert a list of random keys and values to a dictonary

假設鍵由 k n表示,值由 v n表示。

我有一個鍵和值列表,例如my_list_1 = [k1,v1,v2,v3,k2,v4,v5,k3,v6,v7,v8,v9,k4,v10]

鍵也可以在列表中重復,例如my_list_2 = [k1,v1,v2,v3,k2,v4,v5,k3,v6,v7,v8,v9,k2,v10]

特定鍵后面的所有值都屬於該鍵。 例如在 my_list_1; v1,v2,v3 屬於 k1; v4,v5 屬於 k2; v6,v7,v8,v9 屬於 k3,v10 屬於 k4。 因此最終的字典看起來像 -

{
   k1: [v1,v2,v3] ,
   k2: [v4,v5] ,
   k3: [v6,v7,v8,v9],
   k4: [v10]
}

同樣,在 my_list_2 的情況下,它將是:

{
   k1: [v1,v2,v3] ,
   k2: [v4,v5,v10] ,
   k3: [v6,v7,v8,v9]
}

如何在所需字典中轉換這種列表?

注意:我已經有函數來識別列表中的特定項目是鍵還是值。 我們將這些函數稱為 isKey() 和 isValue()。

isKey() 如果項目是鍵則返回 True 否則返回 False

isValue() 如果項目是值則返回 True 否則返回 False

也許您可以考慮使用defaultdict

from collections import defaultdict
from pprint import PrettyPrinter

def is_key(s: str) -> bool:
    return s.startswith('k')

def is_value(s: str) -> bool:
    return s.startswith('v')

def convert_to_dict(my_list: list) -> dict:
    my_defaultdict = defaultdict(list)
    curr_key = None
    for s in my_list:
        if is_key(s):
            curr_key = s
        elif is_value(s):
            if curr_key is not None:
                my_defaultdict[curr_key].append(s)
    return dict(my_defaultdict)

my_list_1 = ['k1', 'v1', 'v2', 'v3', 'k2', 'v4', 'v5', 'k3', 'v6', 'v7', 'v8', 'v9', 'k4', 'v10']
my_dict_1 = convert_to_dict(my_list_1)
print("my_dict_1:")
PrettyPrinter().pprint(my_dict_1)

my_list_2 = ['k1', 'v1', 'v2', 'v3', 'k2', 'v4', 'v5', 'k3', 'v6', 'v7', 'v8', 'v9', 'k2', 'v10']
my_dict_2 = convert_to_dict(my_list_2)
print("\nmy_dict_2:")
PrettyPrinter().pprint(my_dict_2)

Output:

my_dict_1:
{'k1': ['v1', 'v2', 'v3'],
 'k2': ['v4', 'v5'],
 'k3': ['v6', 'v7', 'v8', 'v9'],
 'k4': ['v10']}

my_dict_2:
{'k1': ['v1', 'v2', 'v3'],
 'k2': ['v4', 'v5', 'v10'],
 'k3': ['v6', 'v7', 'v8', 'v9']}

不確定這是否可以以更 Pythonic 的方式完成,但這里有一個應該這樣做的循環。 這假設一個鍵總是直接在它的所有項目之前,並且它的所有項目都在下一個鍵之前。

def my_list_to_dict(my_list):
    my_dict = {}
    my_key = None
    my_values = []
    for item in my_list:
        if isKey(item):
            if my_key != None:
                my_dict[my_key] = my_values
            my_key = item
            my_values = []
        elif isValue(item):
            my_values.append(item)
    return my_dict

您可以像這樣創建一個 function:

def to_dict(items):
    dictionary = {}
    current_key = None

    for item in items:
        if isKey(item):
            current_key = item
        elif current_key:
            if current_key in dictionary:
                dictionary[current_key].append(item)
            else:
                dictionary[current_key] = [item]

    return dictionary

然后這樣稱呼它:

dictionary_1 = to_dict(my_list_1)
dictionary_2 = to_dict(my_list_2)

您可以使用字典並使用循環將每個元素添加到字典中,同時跟蹤當前鍵。

def to_dictionary(my_list):
    output = {}
    current_key = None
    for item in my_list:
        if isKey(item):
            current_key = item
        elif isValue(item):
            output[current_key] = output.get(current_key, []) + [item]
    return output

print(to_dictionary(my_list_1))
{'k1': ['v1', 'v2', 'v3'],
 'k2': ['v4', 'v5'],
 'k3': ['v6', 'v7', 'v8', 'v9'],
 'k4': ['v10']}

暫無
暫無

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

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