从混合类型列表构造字典

To *_* Do 2 python

我在python中有以下列表:

rooms = [1,'John','Mike','Simona',2,'Peter','Mark',3,'Olivia']
Run Code Online (Sandbox Code Playgroud)

我想把它转换成字典.整数表示房间和名称是字符串:

rooms = {'room1': ['John','Mike','Simona'], 'room2': ['Peter','Mark'], 'room3': ['Olivia']}
Run Code Online (Sandbox Code Playgroud)

我怎么能以优雅的方式做到这一点?

Mar*_*ers 5

您可以按类型分组,使用itertools.groupby():

from itertools import groupby

grouped = groupby(rooms, type)
rooms = {}
for key, grp in grouped:
    roomname = 'room{}'.format(next(grp))
    rooms[roomname] = list(next(grouped)[1])
Run Code Online (Sandbox Code Playgroud)

这会按对象类型将输入列表分组.这为您提供了交替的组intstr值.然后循环检索奇数组(整数); next(grouped)循环体中的调用检索偶数组.

这确实假设a)您的第一个值是房间号,b)房间号永远不会被另一个整数直接跟随.如果是,则完全忽略这些整数.

演示:

>>> from itertools import groupby
>>> rooms = [1,'John','Mike','Simona',2,'Peter','Mark',3,'Olivia']
>>> grouped = groupby(rooms, type)
>>> rooms = {}
>>> for key, grp in grouped:
...     roomname = 'room{}'.format(next(grp))
...     rooms[roomname] = list(next(grouped)[1])
... 
>>> rooms
{'room2': ['Peter', 'Mark'], 'room3': ['Olivia'], 'room1': ['John', 'Mike', 'Simona']}
Run Code Online (Sandbox Code Playgroud)

  • 聪明地使用`type`那里:) (2认同)