繁体   English   中英

对列表中的元素进行分组以创建基于数字作为键的字典

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM