0

元のコードはやや複雑でした。次のように単純化します。

与えられた:

  1. クラスインスタンスのリスト、例: l=[c1,c2,c3, ...]
  2. 各インスタンスには、c1.memList=[3,2,5]、c2.memList=[1,2] などのメンバー変数リストがあります。

Todo: memList が '3'-modulo item のみを持つ l のインスタンスを選択します (例: c3.memList=[3,6,9,3,27])。

私は次のようにコーディングすることを考えました:

newl = [ n for n in l if len( [m for m in n.memList if m%3] )==0 ]

しかし: リスト内包表記は、「m が定義されていません」と言ってこれを許可しません。

質問: これを pythonic の方法でコーディングするにはどうすればよいですか?

新しい編集:申し訳ありませんがタイプミスをしました(入力する場合はタイプミス)、うまくいきました。この質問を閉じることを提案します。

4

4 に答える 4

1

「m is not defined」に関するエラーは発生しませんでした。理由はこのスニペットの外にある必要があります。

newl = [ n for n in l if all([ m % 3 == 0  for m in n.memList]) ]

all() 関数は読みやすさを向上させます。計算を高速化するため、リスト構文を使用することは常に良いことです。

于 2012-06-29T14:39:23.720 に答える
1

あなたが与えたコードは私のために働きます!どのような問題が発生しているのかわかりません。ただし、リスト内包表記を少し異なる方法で記述します。

[n for n in l if not any(m % 3 for m in n.memList)]

テスト済み:

>>> class Obj(object):
...     def __init__(self, name, a):
...         self.name = name
...         self.memList = a
...     def __repr__(self):
...         return self.name
...     
>>> objs = [Obj('a', [3, 2, 5]), Obj('b', [3, 6, 9, 3, 27])]
>>> [n for n in objs if not any(m for m in n.memList if m % 3)]
[b]
于 2012-06-29T14:38:51.367 に答える
0

これはあなたが探しているものだと思います。メソッドよりもはるかに冗長ですが、python は読みやすさを重視しています。

    class c(object):
    def __init__(self, memlist):
        self.m = memlist


    c1 = c([3,6,9])
    c2 = c([1,5,7])
    l = [c1,c2]
    newl = []
    for n in l:
        b = True
        for x in n.m:
            if x % 3 != 0:
                b = False
        if b != False:
            newl.append(n)
于 2012-06-29T14:33:03.633 に答える
0

ここに私が持っているものがあります

c1.memList = [0, 1, 2, 3]
c2.memList = [0, 1]
c3.memList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]

そしてこのコード:

for y in l:
    newl = []
    for m in y.memList:
        if m%3 == 0:
            newl.append(m)
    print newl

結果としてこれが得られます:

[0, 3]
[0]
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
于 2012-06-29T14:37:10.587 に答える