将随机键和值的列表转换为字典

问题描述

假设键用 kn 表示,值用 vn 表示。

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

键也可以在列表中重复,如 my_list_2 = [k1,v10]

后跟特定键的所有值都属于该键。例如在 my_list_1 中; v1,v3 属于 k1; v4,v5 属于 k2 ; v6,v9 属于 k3,v10 属于 k4。因此最终的字典看起来像-

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

同样在 my_list_2 的情况下:

{
   k1: [v1,v10],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','v10']
my_dict_2 = convert_to_dict(my_list_2)
print("\nmy_dict_2:")
PrettyPrinter().pprint(my_dict_2)

输出:

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

my_dict_2:
{'k1': ['v1','v10'],'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
,

你可以创建一个这样的函数:

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','k4': ['v10']}