2
>>> odd,even=[ ],[ ]
>>> [even.append(x) if x%2==0 else odd.append(x) for x in range(51)]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> odd
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]

私の質問:最初に宣言しなくても、リスト内包表記で奇数と偶数を分離することは可能odd, even = [], []ですか?

4

8 に答える 8

7

一度だけループするのが最善です。6ラインだけど高速ライン

odd, even=[ ], [ ]
for x in range(51):
    if x%2:
        odd.append(x)
    else:
        even.append(x)
于 2012-05-22T10:46:10.073 に答える
6
even,odd = [],[]
for x in range(51): 
    (odd if x%2 else even).append(x)
于 2012-05-22T11:54:53.547 に答える
4

このことを考慮

evens = [i for i in xrange(1,1000) if i % 2]
odds = [i for i in xrange(1,1000) if i % 2 != 0]
于 2012-05-22T10:43:34.607 に答える
4
>>> even, odd = [[x for x in range(51) if x%2 == 0], [x for x in range(51) if x%2 == 1]]
>>> even
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]
>>> odd
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]

この方法はお勧めしませんが、「ループが1つだけ」でできる方法は次のとおりです。

>>> even, odd = zip(*[(x, x + 1) for x in range(0, 51, 2)])
>>> even
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)
>>> odd
(1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51)
于 2012-05-22T10:44:33.947 に答える
3

itertools特にPython ヘルプのitertools レシピに注意を向けたいと思います。ここでpartition関数を使用できます (Python 2.7 にバックポートされています) 。

from itertools import tee, ifilter, ifilterfalse

def partition(pred, iterable):
    'Use a predicate to partition entries into false entries and true entries'
    # partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
    t1, t2 = tee(iterable)
    return ifilterfalse(pred, t1), ifilter(pred, t2)

def is_odd(n):
    return bool(n%2)

evens, odds = partition(is_odd, range(51))

print list(evens)
print list(odds)

実際、docstring の例は、このケースの使用法を正確に説明しています。イテレータを返すため、list印刷時に使用する必要があります。

于 2012-05-22T14:08:42.860 に答える
2

これが便宜上数字を使用した単純化された問題である場合、私の答えは関係ありませんが、あなたが要求したことを行う最も簡単な方法は実際には次のとおりです。

>>> odd, even = range(1, 51, 2), range(0, 51, 2)

これにより、次のことが得られます。

>>> list(odd)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]
>>> list(even)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]
于 2012-05-22T11:34:04.693 に答える
1

このバージョンを試してみてください: 私にとってはエレグナット、コンパクトでよく理解できます

even,odd = [],[]
for x in range(51): x%2 and even.append(x) or odd.append(x)
于 2012-05-22T11:02:45.777 に答える
1

一般的な問題への取り組み:

predicateを返す述語関数が与えられた場合、TrueまたはFalseオブジェクトが与えられたときに、順序を維持しながら述語に従ってリストを2つのサブリストに分割します

sorted次に、機能が安定しているという事実を使用することができるので、as key でソートすると、各部分内の順序を維持しながら、述語が左にpredicateある値と値を使用して、リストが未知のポイントで効果的に 2 つに分割されます。FalseそれはTrue右側にあります。

これで、同じキーを使用itertools.groupbyして、この未知のポイントで分割できます。

from itertools import groupby

predicate = lambda x: x % 2 == 0

def group_by_predicate(L, pred):
    return [list(i) for k, i in groupby(sorted(L, key=pred), key=pred)]

odd, even = group_by_predicate(range(51), predicate)

これは、値が等間隔でない場合predicateでもTrue機能します...たとえば、predicateTrue素数の場合などです。

于 2012-05-22T13:02:57.657 に答える