我想從幾個鍵的列表中獲取一維值列表。列表理解來自列表中的字典的拼版值
這就是我如何做到這一點的紅寶石:
irb> list_ = [{a:1, b:2, c:3}, {a:4, b:5, c:6}]
irb> list_.flat_map{ |dict_| dict_.values_at :b, :c }
=> [2, 3, 5, 6]
現在我該怎麼辦呢在Python?
我想從幾個鍵的列表中獲取一維值列表。列表理解來自列表中的字典的拼版值
這就是我如何做到這一點的紅寶石:
irb> list_ = [{a:1, b:2, c:3}, {a:4, b:5, c:6}]
irb> list_.flat_map{ |dict_| dict_.values_at :b, :c }
=> [2, 3, 5, 6]
現在我該怎麼辦呢在Python?
我會做這樣的事情:
>>> lst = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
>>> [dct[i] for dct in lst for i in ('b', 'c')]
[2, 3, 5, 6]
+1這是優雅的,幾乎是我的解決方案的兩倍。 – 2013-05-06 10:16:30
您可以使用itertools.chain
:
>>> from itertools import chain,imap
>>> lis = [{'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':6}]
>>> list(chain.from_iterable((x[y] for y in ('b','c')) for x in lis))
[2, 3, 5, 6]
或列表理解版本(更少的內存效率):
>>> list(chain.from_iterable([x[y] for y in ('b','c')] for x in lis))
[2, 3, 5, 6]
正如jamylak建議你也可以使用operator.itemgetter
和itertools.imap
與itertools.chain
,這甚至快於Volatility使用的LC version。
>>> from operator import itemgetter
>>> list(chain.from_iterable(imap(itemgetter('b', 'c'), lis)))
[2, 3, 5, 6]
時間:
>>> lis = [{'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':6}]*10**5
>>> %timeit list(chain.from_iterable((x[y] for y in ('b','c')) for x in lis))
1 loops, best of 3: 276 ms per loop
>>> %timeit list(chain.from_iterable([x[y] for y in ('b','c')] for x in lis))
1 loops, best of 3: 183 ms per loop
>>> %timeit list(chain.from_iterable(imap(itemgetter('b', 'c'), lis))) #winner
10 loops, best of 3: 74.6 ms per loop
>>> %timeit [dct[i] for dct in lis for i in ('b', 'c')]
10 loops, best of 3: 98.4 ms per loop
@Charles,讓我問:什麼是錯的標籤?爲什麼我會看到「4位訂戶」,但沒有問題存在。 – Nakilon 2013-05-06 17:06:09
'one-liner'是一個[meta標籤](http://blog.stackoverflow.com/2010/08/the-death-of-meta-tags/)。標記訂閱在標記刪除後不存在。你不會相信訂閱我永恆的剋星標籤「服務器」的人數。 – Charles 2013-05-06 18:16:49