2016-11-08 21 views
4

のリスト:フィルター私はタプルのリストのリストを持っているタプルのリスト

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 

私が「なし」のいずれかのインスタンスをフィルタリングしたいと思います:私はしました

newList = [[(2,45),(3,67)], [(4,56),(5,78)], [(2, 98)]] 

最も近いです

newList = [] 
for data in oldList: 
    for point in data: 
     newList.append(filter(None,point)) 

答えて

7

これを行うための最短の方法は、ネストされたリストの内包表記である:

>>> newList = [[t for t in l if None not in t] for l in oldList] 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 

リストのリストを扱っているので、2つのリスト内包をネストする必要があります。リスト内包表記[[...] for l in oldList]の外側部分は、含まれる各内側リストの外側リストを反復処理します。それで内部リストの理解の内側には[t for t in l if None not in t]があります。これは、リスト内の各タプルにNoneが含まれていないことを言う簡単な方法です。

(おそらく、あなたはltより良い名前を選択する必要がありますが、それはあなたの問題領域に依存するであろう。私はより良いコードの構造を強調するために、単一文字の名前を選択しました。)

あなたの場合不慣れまたはリスト内包と不快です、これは次のように論理的に等価である:

>>> newList = [] 
>>> for l in oldList: 
...  temp = [] 
...  for t in l: 
...   if None not in t: 
...    temp.append(t) 
...  newList.append(temp) 
... 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
1

あなた旧姓:このループであるが、それは全体のタプル(のみ「なし」)をドロップしないと、それはまた、タプル構造のリストのリストを破壊しに来ます

:、

また
>>> new_list = [] 
>>> for sub_list in oldList: 
...  temp_list = [] 
...  for item in sub_list: 
...   if item[1] is not None: 
...    temp_list.append(item) 
...  new_list.append(temp_list) 
... 
>>> new_list 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 

同じことを達成するためのより良い方法をとしてリスト内包表現を使用している:あなたの中のように、リストの入れ子構造を維持するための最初のforループは一時リストリストを作成するD

>>> oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 
>>> [[(k, v) for k, v in sub_list if v is not None ] for sub_list in oldList] 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
0

はなぜちょうどあなたのタプルpointの最初の要素が存在するかTrueであるかどうかを確認するためにifブロックを追加していません。リストの理解を使うこともできますが、私はあなたがPythonの初心者であると仮定します。

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 

newList = [] 
for data in oldList: 
    tempList = [] 
    for point in data: 
     if point[1]: 
      tempList.append(point) 
    newList.append(tempList) 

print newList 
>>> [[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
+0

これは私が保持しようとしている構造を破壊するこれを行うには、これまでで最も標準的な方法により、Pythonのリスト内包を利用することです。 – mk8efz

+0

@ mk8efzさんが私の答えを更新しました。見てください –

0

タプルは不変なので、変更することはできません。あなたはそれらを交換する必要があります。

>>> oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 
>>> [[tup for tup in sublist if not None in tup] for sublist in oldList] 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
>>> 
0

リスト内包:

>>> newList = [[x for x in lst if None not in x] for lst in oldList] 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
>>> 
+0

。あなたはコピー;) –

+0

ハハ、私はちょうどそこに他のコメントが見たxD –

関連する問題