Python 2.7:从特殊格式的列表对象生成字典对象
我有一个列表类型的对象,如:Python 2.7:从特殊格式的列表对象生成字典对象,python,list,python-2.7,dictionary,Python,List,Python 2.7,Dictionary,我有一个列表类型的对象,如: f=[77.0,'美元',77.95, 103.9549欧元,107.3634欧元, 128.1884英镑,132.3915英镑, 0.7477,'日元',0.777] 我想创建一个字典,如下所示: d= {'EUR':[103.9549,107.3634], “英镑”:[128.1884132.3915], ‘日元’:[0.7477,0.777], “美元”:[77.0,77.95]} 我试着利用这些答案,然后 但是,我想不出正确的方法 到目前为止,我的解决方
f=[77.0,'美元',77.95,
103.9549欧元,107.3634欧元,
128.1884英镑,132.3915英镑,
0.7477,'日元',0.777]
我想创建一个字典,如下所示:
d=
{'EUR':[103.9549,107.3634],
“英镑”:[128.1884132.3915],
‘日元’:[0.7477,0.777],
“美元”:[77.0,77.95]}
我试着利用这些答案,然后
但是,我想不出正确的方法
到目前为止,我的解决方案是:
cs=[str(x)表示f中的x,如果[str,unicode]中的类型(x)]
vs=[如果在[int,float]中键入(x),则f中x的浮点(x)]
d=dict(范围(0,len(vs),2)]内i的压缩(cs,[[vs[i],vs[i+1]]))
但是,什么是聪明的一行呢?怎么样:
In [5]: {f[i+1]: [f[i], f[i+2]] for i in range(0, len(f), 3)}
Out[5]:
{'EUR': [103.9549, 107.3634],
'GBP': [128.1884, 132.3915],
'JPY': [0.7477, 0.777],
'USD': [77.0, 77.95]}
使用
zip
,听写理解:
>>> f = [
... 77.0, 'USD', 77.95,
... 103.9549, 'EUR', 107.3634,
... 128.1884, 'GBP', 132.3915,
... 0.7477, 'JPY', 0.777
... ]
>>> {currency: [v1, v2] for v1, currency, v2 in zip(*[iter(f)]*3)}
{'JPY': [0.7477, 0.777],
'USD': [77.0, 77.95],
'GBP': [128.1884, 132.3915],
'EUR': [103.9549, 107.3634]}
[iter(f)]*3
来自于年的grouper。这一定是单行程序历史上最丑陋的单行程序,但是,嘿,它可以工作:
print dict(zip((i[1] for i in zip(f[::3],f[1::3],f[2::3])), ([i[0],i[2]] for i in zip(f[::3],f[1::3],f[2::3]))))
您的列表结构是常量和持久性的吗?也就是说,基本上你希望3的每一个第二个元素都是键,第一个和第三个元素都是值列表?@favoretti是的,对,为什么你想要一行?你想做的事情显然不简单。最好是编写一个实际的方法,这样人们就更容易理解您要做的事情。有很多东西可以表示为一行程序,但它们并不十分清楚……这是python而不是perl。:)@FrobberOfBits的原因,依我看,从概念上讲,这只是一个操作;从两份清单中选出一份。这就是为什么单衬里更合适的原因。自白:我沉迷于一句台词,我觉得这是“诗意的”;)@我认为他们很有诗意,很好,请考虑一下以后维护你的代码的人的观点。那个家伙可能更喜欢明确的文档和清晰的流程,而不是优雅和经济。这在概念上只是一个操作;函数定义(不是一行程序)通常是我将一系列实现步骤包装成单个概念操作的目标。该语言有很多语法明确支持函数定义中的语法。它可以工作,但一周后你将不知道你在想什么。@arshajii,没错。只是真的esoteric@Dunno)谢谢你这么快就帮了我的忙。这就是答案,我一直在寻找……:)@NPE的道具,用于制作精确的单衬里;NPE回答了OP的问题。但我不认为这应该作为一个班轮。如果我要维护这段代码,我必须回头看一个数据结构的示例,以确定WTF I+1、I和I+2应该引用。至少,OP应该意识到这段代码非常需要一两条注释。
>>> f = [77.0, 'USD', 77.95,
103.9549,'EUR', 107.3634,
128.1884, 'GBP', 132.3915,
0.7477, 'JPY', 0.777]
>>> {f[v+1]:[f[v],f[v+2]] for v in range(0, len(f), 3)}
{'JPY': [0.7477, 0.777], 'USD': [77.0, 77.95], 'GBP': [128.1884, 132.3915], 'EUR': [103.9549, 107.3634]}