我有一个列表:
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
)