2017-07-10 21 views
3

私はこのような辞書のリストを持っている:辞書のリストをタプルのリストに変換する方法は?

l = [{'pet': 'cat', 'price': '39.99', 'available': 'True'}, 
{'pet': 'cat', 'price': '67.99', 'available': 'True'}, 
{'pet': 'dog', 'price': '67.00', 'available': 'False'} 
,...., 
{'pet': 'fish', 'price': '11.28', 'available': 'True'}] 

私はに上記のリストを変換できますか? (*)

l_2 = [('cat','39.99','True'),('cat','67.99','True'),('dog','67.00','False'),....,('fish','11.28','True')] 

Iは.items()l[1]を使用しようとした:

for l in new_list: 
     new_lis.append(l.items()) 

しかし、私は、(*)

ように、タプルのリストに辞書のリストの第2要素位置を抽出することができませんでした
+1

'l.values()'あなたのループ内で – PRMoureu

答えて

5

提案された解決策1:map(短いと甘いが、遅い):

In [2186]: list(map(lambda x: tuple(x.values()), l)) 
Out[2186]: 
[('39.99', 'cat', 'True'), 
('67.99', 'cat', 'True'), 
('67.00', 'dog', 'False'), 
('11.28', 'fish', 'True')] 

lambda関数では、dictの値からタプルを作成することを指定します。

提案された解決策2:リストの理解を使用してください。もう一つの答えは、すでにこれに対する解決策を提供しています。

また、既存のソリューションへの修正として、あなただけの.values().items()を交換する必要があります。これらのソリューションのすべてにおいて、生成されたタプルの一切保証オーダーがないことを

In [2203]: new_list = [] 

In [2204]: for x in l: 
     ...:  new_list.append(tuple(x.values())) 
     ...:  

In [2205]: new_list 
Out[2205]: 
[('39.99', 'cat', 'True'), 
('67.99', 'cat', 'True'), 
('67.00', 'dog', 'False'), 
('11.28', 'fish', 'True')] 

注意を。


ソリューション1の代わりにlambdaの、バニラの機能を使用して高速化することができます。

In [2213]: def foo(x): return tuple(x.values()) 

In [2214]: list(map(foo, l)) 

いくつかのタイミング:あなたが必要なもの

Solution 1 (improved): 100000 loops, best of 3: 2.47 µs per loop 
Solution 2:   1000000 loops, best of 3: 1.79 µs per loop 
Your solution:   100000 loops, best of 3: 2.03 µs per loop 
+0

はどうもありがとうございましたとしてみてください! –

+1

@ J.Do喜んで助けてください。 :) –

+0

dict orderingの考慮はありませんか? – user2357112

4

は、例えば.values()ない.items()です(list-comprehensionを使用):

l_2 = [tuple(x.values()) for x in l] 

出力:

[('cat', 'True', '39.99'), ('cat', 'True', '67.99'), ('dog', 'False', '67.00'), ('fish', 'True', '11.28')] 
関連する問題