2017-02-23 6 views
0

"リスト内包表記を使用して、マネージャのみを含むように時間表をフィルタリングします。リスト理解表のフィルタリング

私は2つのテーブルがあります。時間&タイトル

hours = [["Alice", 43], ["Bob", 37], ["Fred", 15]] 
titles = [["Alice", "Manager"], ["Betty", "Consultant"], ["Bob", "Assistant"]] 

私はダウンリストの内包表記を使用して、管理者のみに時間テーブルをフィルタリングする必要があります。これまでのところ私は、バーチャルツールからGETを使用してマネージャーの名前で別のテーブルを作成するためにタイトルを使用している私は私のmanager_listテーブルを取り、時間と比較しようとしている今[['Alice', 'Manager']]

を生成

from toolz import get 
manager_list = [i for i in titles if get(-1,i) == "Manager"] 

manager_list内の同じ名前のエントリだけを保持します。しかし、私はそれを行う方法を把握していないようです。私はただ空のテーブルを取得し続けます。

今私が持っているものはmanager_hours = [i for i in hours if get(0,i) in manager_list]ですが、動作しません。どのように2つを比較するのか分かりません。

私が探している最終結果は[['Alice', 43]]ですが、そこに着く方法はわかりません。

答えて

0

使用しているデータが正確でない可能性がある場合filter

names = [x for x, y in titles if y == "Manager"] 
managers = [(x, y) for (x, y) in hours if x in names] 

DEMO:

>>> names = [x for x, y in titles if y == "Manager"] 
>>> names 
['Alice'] 
>>> managers = [(x, y) for (x, y) in hours if x in names] 
>>> managers 
[('Alice', 43)] 

あなたは「名前の同じセットで2つのリストを持っているだろうと仮定すると、これを実行する別の方法"、そして長さ、あなたができることの1つは、zipを使って2つのリストを結合することです。このような

何か:

hours = [["Alice", 43], ["Bob", 37], ["Fred", 15]] 
titles = [["Alice", "Manager"], ["Betty", "Consultant"], ["Bob", "Assistant"]] 

managers = [(x, y) for ((x, y), (z, w)) in zip(hours, titles) if w == "Manager"] 
+0

は、ありがとうございました! – Absiel

+0

喜んで助けました。答えが有用な場合は、回答を受け入れたものとしてマークしてください。あなたのお手伝いをしてくれた答えの横にある「グリーンティックマーク」。 – karthikr

0

は、私は、そのことでフィルタリングし、自分自身で管理職を得るために、一時的なセットを使用します。

hours = [["Alice", 43], ["Bob", 37], ["Fred", 15]] 
titles = [["Alice", "Manager"], ["Betty", "Consultant"], ["Bob", "Assistant"]] 

managers = set(l[0] for l in titles if l[1] == "Manager") 

managers 
Out[4]: {'Alice'} 

manager_hours = [l for l in hours if l[0] in managers] 

manager_hours 
Out[6]: [['Alice', 43]] 

しかし、デザインの面では、あなたのデータを保持するためにdict Sを使用して考えることをお勧めします。これは、キーと値のペアのための正しいデータ構造です。

0

あなたはtitlesリスト辞書作り、その後、title辞書を検索することで、あなたのhoursリストをフィルタリングすることができます。これは途方もなく助けた

title_d = dict(titles)  
[i for i in hours if title_d.get(i[0]) == "Manager"] 
# [['Alice', 43]]