[英]Group element in a list to create dictionary based on digits as keys
我有一个类似的列表:
list = ['1', 'call-appr', '5', 'call-pickup', '2', 'call-appr', '6', 'call-park', '3', 'call-appr', '7', 'empty', '4', 'team', 'E', '123-456-212', 'R.']
我想将它们分组以获得以下格式的字典:
dict1 = {
'1': 'call-appr',
'2': 'call-appr',
'3':'call-appr',
'4': ['team','E','123-456-212','R'],
'5':'call-pickkup',
'6':'call-park',
'7':'empty'
}
这是我尝试过的代码:
for value in list:
if value.isdigit():
index = list.index(value)
list_index_num.append(index)
print (list_index_num)
for value in range(len(list_index_num)):
if value != len(list_index_num)-1:
number = range(list_index_num[value]+1, list_index_num[value+1])
else:
number = range(list_index_num[value]+1, len(list))
for i in number:
dct = {list[list_index_num[value]]:list[i]}
print (number)
您可以使用itertools.takewhile()
和enumerate()
与字典理解来实现这一点:
from itertools import takewhile
my_list = ['1', 'call-appr', '5', 'call-pickup', '2', 'call-appr', '6', 'call-park', '3', 'call-appr', '7', 'empty', '4', 'team', 'E', '123-456-212', 'R.']
my_dict = {s: list(takewhile(lambda x: not x.isdigit(), my_list[i+1:])) for i, s in enumerate(my_list) if s.isdigit()}
my_dict
将在哪里:
{'1': ['call-appr'], '5': ['call-pickup'], '2': ['call-appr'], '6': ['call-park'], '3': ['call-appr'], '7': ['empty'], '4': ['team', 'E', '123-456-212', 'R.']}
在这里,我使用str.isdigit()
作为过滤器来识别字符串是否为数字。
请注意,在这里您甚至可以将单值项作为列表而不是字典中的字符串,您可以通过对字典进行显式迭代来删除它。
如果您使用的是 Python 版本 3.8+,则可以使用Walrus Operator :=
在字典理解中将其删除:
my_dict = {s: l if len(l:=list(takewhile(lambda x: not x.isdigit(), my_list[i+1:]))) > 1 else l[0] for i, s in enumerate(my_list) if s.isdigit()}
这将以您想要的格式返回字典:
{
'1': 'call-appr',
'5': 'call-pickup',
'2': 'call-appr',
'6': 'call-park',
'3': 'call-appr',
'7': 'empty',
'4': ['team', 'E', '123-456-212', 'R.']
}
您可以在避免遍历列表两次的循环中执行此操作:
data = ['1', 'call-appr', '5', 'call-pickup', '2', 'call-appr',
'6', 'call-park', '3', 'call-appr', '7', 'empty',
'4', 'team', 'E', '123-456-212', 'R.']
dict1 = dict()
for v in data:
if v.isdigit(): dict1[v] = group = []
else: group.append(v)
print(dict1)
{'1': ['call-appr'], '5': ['call-pickup'], '2': ['call-appr'],
'6': ['call-park'], '3': ['call-appr'], '7': ['empty'],
'4': ['team', 'E', '123-456-212', 'R.']}
我不建议使用值类型根据出现次数而变化的数据结构。 这将使所有使用它的代码更加复杂,因为它需要不断地执行类型检查。
但是,如果您需要这样做,则可以像这样修改循环
dict1 = dict()
for v in data:
if v.isdigit(): k = v
elif k not in dict1: dict1[k],group = v,[v]
else: dict1[k] = group = group+[v]
print(dict1)
{'1': 'call-appr', '5': 'call-pickup', '2': 'call-appr',
'6': 'call-park', '3': 'call-appr', '7': 'empty',
'4': ['team', 'E', '123-456-212', 'R.']}
dict1 ={}
for element in list1:
if element.isdigit():
current_key = element
dict1[current_key] = []
else:
dict1[current_key].append(element)
# this part only flattens one-element lists
for key in list(dict1.keys()):
if len(dict1[key]) == 1:
dict1[key] = dict1[key][0]
我想出了这样的东西,它似乎完全符合您的要求。
我相信这会奏效:
dict={}
for i in range(0,len(my_list),2):
dict[my_list[i]]=my_list[i+1]
(注意我将您的标识符list
更改为my_list
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.