我在python中遇到了一个基本问题。我有这个清单:
['[A]',a,b,c,x,y,'[B]',d,f,'[C]',g,h,e]
我想将其转换为字典:
{A:[a,b,c,x,y],B:[d,f],C:[g,h,e]}
有没有人有任何优雅的想法? 谢谢
答案 0 :(得分:4)
如果您使用密钥在列表中的事实,那么您可以按列表进行分组,将结果配对并将其提供给dict
,例如:
from itertools import groupby, izip
data = [['A'],'a','b','c',['B'],'d','e','f',['C'],'g','h','e']
grouped = (next(g)[0] if k else list(g) for k, g in groupby(data, lambda L: isinstance(L, list)))
result = dict(izip(*[iter(grouped)] * 2))
#{'A': ['a', 'b', 'c'], 'C': ['g', 'h', 'e'], 'B': ['d', 'e', 'f']}
根据comment
进行了更新......是字符串:['[A]','a','b','c','x','y','[B]','d','f' ,'[C]','g','h','e']以及确定密钥的规则是它是一个字符串'[someString]'
更改分组以使用正则表达式(根据需要进行调整),例如:
import re
grouped = (k.group(1) if k else list(g) for k, g in groupby(data, re.compile(r'\[(.*?)\]$').match))
答案 1 :(得分:3)
假设块总是相同的大小,你可以编写这样的字典理解(输入列表是l
):
{l[i][0]: l[i+1:i+4] for i in range(0, len(l), 4)}
答案 2 :(得分:0)
如果块大小是动态的,我会使用一些关于配置变量类型的假设以及类型检查(这在python中通常不是一个好主意,但在这种情况下我认为它有助于可读性) :
from collections import defaultdict
a = [['A'],'a','b','c',['B'],'d','e','f',['C'],'g','h','e']
grouper = None
config = defaultdict(list)
for x in a:
if isinstance(x, (list, tuple)):
# We encountered a list or tuple, so this is a new section
grouper = x[0]
else:
config[grouper].append(x)
print config
结果:
defaultdict(<type 'list'>, {'A': ['a', 'b', 'c'], 'B': ['d', 'e', 'f'], 'C': ['g', 'h', 'e']})
答案 3 :(得分:0)
我知道它的愚蠢...
我知道。
但它有效:)
def convert(l):
keys = [i for i in l if isinstance(i, list)]
keys_index = [l.index(i) for i in keys]
keys_index.append(None)
result = {}
for i in range(0, len(keys_index)-1):
result[l[keys_index[i]][0]] = [j for j in l[keys_index[i]+1:keys_index[i+1]]]
return result