2

これはPythonのリストです:

a = [{a:3、b:4}、{c:14、d:24}]

辞書の値のみで構成されるリストを作成するにはどうすればよいですか?

このような:

a1 = [3,4,14,24]

これをforループで作成しましたが、これを行う別の方法はありますか?

4

4 に答える 4

3

順序は明らかに重要ではないため:

>>> a = [{'a':3,'b':4}, {'c':14,'d':24}]
>>> a
[{'a': 3, 'b': 4}, {'c': 14, 'd': 24}]

listcomp で値を取得できます。

>>> [d.values() for d in a]
[[3, 4], [14, 24]]

そして、ネストされた listcomp を使用してこれを平坦化します。

>>> [value for d in a for value in d.values()]
[3, 4, 14, 24]

これはと同等です

>>> newlist = []
>>> for d in a:
...     for value in d.values():
...         newlist.append(value)
... 
>>> newlist
[3, 4, 14, 24]

そこに単語さえ入れたくないfor場合は、使用できると思います

>>> from itertools import chain
>>> list(chain(*map(dict.values, a)))
[3, 4, 14, 24]

[アップデート:]

いくつかのパフォーマンス比較 (主に N が大きい場合のスケーリングに関する情報のため):

>>> a = [{'a':3,'b':4}, {'c':14,'d':24}]
>>> 
>>> timeit [value for d in a for value in d.itervalues()]
1000000 loops, best of 3: 1.02 us per loop
>>> timeit [value for d in a for value in d.values()]
1000000 loops, best of 3: 1.32 us per loop
>>> timeit list(chain(*map(dict.values, a)))
100000 loops, best of 3: 4.45 us per loop
>>> timeit reduce(operator.add, (d.values() for d in a))
100000 loops, best of 3: 2.01 us per loop
>>> timeit sum((d.values() for d in a), [])
100000 loops, best of 3: 2.08 us per loop
>>> 
>>> a = [{'a':3,'b':4}, {'c':14,'d':24}] * 1000
>>> 
>>> timeit [value for d in a for value in d.itervalues()]
1000 loops, best of 3: 612 us per loop
>>> timeit [value for d in a for value in d.values()]
1000 loops, best of 3: 915 us per loop
>>> timeit list(chain(*map(dict.values, a)))
1000 loops, best of 3: 1.07 ms per loop
>>> timeit reduce(operator.add, (d.values() for d in a))
100 loops, best of 3: 17.1 ms per loop
>>> timeit sum((d.values() for d in a), [])
100 loops, best of 3: 17.1 ms per loop
于 2013-01-26T15:44:38.997 に答える
2

これは、リスト内包表記を使用して1行で実行できます。

>>> a = [{'a':3,'b':4}, {'c':14,'d':24}]    #List


>>> [v for d in a for v in d.values()] #Comprehension
    [3, 4, 14, 24]
于 2013-01-26T15:45:31.837 に答える
1
In [9]: import operator

In [10]: a = [{'a':3,'b':4}, {'c':14,'d':24}]

In [11]: reduce(operator.add, (d.values() for d in a))
Out[11]: [3, 4, 14, 24]

Python 辞書は順不同であることに注意してください。これは、各辞書内のキー (およびその値) の順序が保証されていないことを意味します。

于 2013-01-26T15:44:19.837 に答える
0

使用itertools chain 方法

import itertools

a = [{'a':3,'b':4}, {'c':14,'d':24}]
list(itertools.chain(*(x.itervalues() for x in a)))
>>> [3, 4, 14, 24]
于 2013-01-26T16:00:46.893 に答える