5

今では、特定の条件でリストを分割する便利な方法が見つかりませんでした。たとえば、レコードリストがあります。

 a = ((0,1),(1,0),(0,2),(1,0),(3,0),(4,0),(0,3),(1,5)....)

コンテンツを2つのリストに分割したい

alist = []
blist = []
for x in a:
    if x[0] == 0:
        alist.append(x)
    elif x[0] == 1:
        blist.append(x)

あまり簡潔ではありません。

リスト内包表記として書かれています:

aList = [x for x in a if x[0] == 0]
bList = [x for x in a if x[0] == 1]

リスト内包表記は通常、読みとパフォーマンスに適していますが、この場合、リストを2回繰り返す必要があります。

この仕事をするためのより良い方法はありますか?

4

5 に答える 5

6

まあ、条件は異なります、あなたが2つのループを必要とするのも不思議ではありません。ただし、読みやすさをいくらか犠牲にしたい場合は、

aList, bList = [[x for x in a if x[0] == i] for i in (0, 1)]
于 2012-12-31T10:49:42.287 に答える
6

1 行追加すると、読みやすさ (および FPness) を犠牲にして、ループがより簡潔になります。

alist = []
blist = []
bothlists = [alist, blist]
for x in a:
  bothlists[x[0]].append(x)
于 2012-12-31T10:59:32.187 に答える
1

本当に複雑にしたい場合は、 からいくつかの関数をインポートしitertoolsて、読み取り可能なソリューションをさらに難読化することができます。

from operator import itemgetter
from collections import defaultdict

d = defaultdict(list)

for key, value in itertools.groupby(a, itemgetter(0)):
    d[key].append(list(value))

出力は次のとおりです。

>>> print d[0]
[[(0, 1)], [(0, 2)], [(0, 3)]]
>>> print d[1]
[[(1, 0)], [(1, 0)], [(1, 5)]]
>>> print d[4]
[[(4, 0)]]

このコードは、最初のタプルの値をキーとして使用して、アイテムを辞書にグループ化するだけです。これは、コードよりも少し一般的です。

于 2012-12-31T11:03:53.267 に答える
0

私は使用しますfilter、参照してください:http: //docs.python.org/2/library/functions.html#filter

>>> a = ((0,1), (1,0), (0,2), (1,0), (3,0), (4,0), (0,3), (1,5))
>>> filter(lambda x: x[0] == 1, a)
((1, 0), (1, 0), (1, 5))

冗長なコードを回避するために、次のように反復可能で条件を収集できます。

>>> fs = (lambda x: x[0] == 0, lambda x: x[0] == 1)
>>> for f in fs:
...     filter(f, a)
...
((0, 1), (0, 2), (0, 3))
((1, 0), (1, 0), (1, 5))
于 2012-12-31T14:19:55.220 に答える