将随机键和值列表转换为字典
Convert a list of random keys and values to a dictonary
假设键由 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() returns 如果项目是键则为真否则 returns 假
isValue() returns 如果某项是一个值则为真否则 returns 假
也许你可以考虑使用 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']}
不确定这是否可以用更 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', 'v2', 'v3'],
'k2': ['v4', 'v5'],
'k3': ['v6', 'v7', 'v8', 'v9'],
'k4': ['v10']}
假设键由 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() returns 如果项目是键则为真否则 returns 假
isValue() returns 如果某项是一个值则为真否则 returns 假
也许你可以考虑使用 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']}
不确定这是否可以用更 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', 'v2', 'v3'],
'k2': ['v4', 'v5'],
'k3': ['v6', 'v7', 'v8', 'v9'],
'k4': ['v10']}