列表中的Group元素,以数字作为键创建字典



我有一个列表:

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:=as:

字典推导式中删除它
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)

最新更新