Python 将列表中的元素分组,以根据数字作为键创建字典

Python 将列表中的元素分组,以根据数字作为键创建字典,python,list,dictionary,Python,List,Dictionary,我有这样一个清单: 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':'cal

我有这样一个清单:

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)

我相信这会奏效:

dict={}
for i in range(0,len(my_list),2):
    dict[my_list[i]]=my_list[i+1]

注意:我将您的标识符列表更改为我的\u列表

我相信这会起作用:

dict={}
for i in range(0,len(my_list),2):
    dict[my_list[i]]=my_list[i+1]
注意:我已将您的标识符列表更改为我的列表,您可以使用并通过字典理解来实现以下目的:

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()}
我的遗嘱将有:

{'1': ['call-appr'], '5': ['call-pickup'], '2': ['call-appr'], '6': ['call-park'], '3': ['call-appr'], '7': ['empty'], '4': ['team', 'E', '123-456-212', 'R.']}
在这里,我使用作为过滤器来识别字符串是否为数字

请注意,在这里,您甚至可以将单值项作为列表而不是字典中的字符串,您可以通过对字典进行显式迭代来删除它们

如果您使用的是Python版本3.8+,则可以使用:=as:

将以所需格式返回词典:

{
    '1': 'call-appr', 
    '5': 'call-pickup', 
    '2': 'call-appr', 
    '6': 'call-park', 
    '3': 'call-appr', 
    '7': 'empty', 
    '4': ['team', 'E', '123-456-212', 'R.']
}
您可以使用和与词典理解一起实现以下目的:

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()}
我的遗嘱将有:

{'1': ['call-appr'], '5': ['call-pickup'], '2': ['call-appr'], '6': ['call-park'], '3': ['call-appr'], '7': ['empty'], '4': ['team', 'E', '123-456-212', 'R.']}
在这里,我使用作为过滤器来识别字符串是否为数字

请注意,在这里,您甚至可以将单值项作为列表而不是字典中的字符串,您可以通过对字典进行显式迭代来删除它们

如果您使用的是Python版本3.8+,则可以使用:=as:

将以所需格式返回词典:

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

您可以在循环中执行此操作,以避免重复查看列表两次:

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

你的问题是什么?为我实现此功能对于此网站来说是离题的。你必须做出诚实的尝试,然后问一个关于你的算法或技术的具体问题。请拿,读,和,并提供一个。@PranavHosangadi:很抱歉,我忘了放我的脚本..旁注:不要命名变量列表;随着时间的推移,名字阴影的内置会给你带来无尽的悲伤。当您使用dct而不是dict时,您似乎注意到了这一点;lst而不是列表也是一个类似的好主意。你的问题是什么?为我实现此功能对于此网站来说是离题的。你必须做出诚实的尝试,然后问一个关于你的算法或技术的具体问题。请拿,读,和,并提供一个。@PranavHosangadi:很抱歉,我忘了放我的脚本..旁注:不要命名变量列表;随着时间的推移,名字阴影的内置会给你带来无尽的悲伤。当您使用dct而不是dict时,您似乎注意到了这一点;lst而不是list也是一个类似的好主意。它不适用于后面有4个元素的“4”这也会引发索引器错误您还应该更改名称dict…它不适用于后面有4个元素的“4”这也会引发索引器错误您还应该更改名称dict…很酷。非常感谢,不管怎么说,在一行中编写代码时会很混乱^ ^ ^ ^ ^ ^ ^我也使用str.isdigit,但它没有像您一样真正有用,很酷。非常感谢,不管怎么说,在一行中编写代码时它太混乱了^ ^ ^ ^ ^ ^ ^ ^我也使用了str.isdigit,但它没有真正的用处,就像你能给我解释dict1[v]=group=[]它们是如何工作的吗?这会为dict1字典的键v和变量组分配一个空列表。从那时起,组变量和dict1[v]项指向同一个列表。所以,当我稍后将一个值附加到组中时,我实际上也将它添加到最后一个dict1[v]项中。这样,我就不必在清单的后续条目上的dict1中再次找到密钥。你是多么聪明啊!你能给我解释一下dict1[v]=group=[]它们是如何工作的吗?这会给dict1字典和变量组分配一个空列表。从那时起,组变量和dict1[v]项指向同一个列表。所以,当我稍后将一个值附加到组中时,我实际上也将它添加到最后一个dict1[v]项中。这样,我就不必在清单的后续条目上的dict1中再次找到密钥。你是多么聪明啊!