Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7:从特殊格式的列表对象生成字典对象_Python_List_Python 2.7_Dictionary - Fatal编程技术网

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]}