【问题标题】:Convert a list of random keys and values to a dictonary将随机键和值列表转换为字典
【发布时间】:2021-05-03 16:43:53
【问题描述】:

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

我有一个键和值列表,例如 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

【问题讨论】:

    标签: python python-3.x list dictionary pyscripter


    【解决方案1】:

    不确定这是否可以以更 Python 的方式完成,但这里有一个循环应该这样做。 这假定一个键将始终直接位于其所有项之前,并且其所有项都位于下一个键之前。

    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
    

    【讨论】:

    • 我觉得这是唯一可行的方法。非常感谢
    • 请注意,这也会丢弃可能在第一个键之前的任何值
    【解决方案2】:

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

    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)
    

    【讨论】:

    • 工作。非常感谢您的及时回复。 !!
    【解决方案3】:

    也许您可以考虑使用 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)
    

    输出:

    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']}
    

    【讨论】:

    • 非常感谢。明白了逻辑并像魅力一样工作!
    【解决方案4】:

    您可以使用字典并使用循环将每个元素添加到字典中,同时跟踪当前键。

    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']}
    

    【讨论】:

    • 明白逻辑。非常感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多