2017-02-23 100 views
0

「使用列表解析過濾小時表以僅包含管理員。」列表理解表過濾

我有兩個表:小時&冠軍

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

我需要向下過濾小時表格只使用列表理解管理者。到目前爲止,我已經使用的標題來創建一個單獨的表使用得到圖爾茨該經理的名字

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

產生[['Alice', 'Manager']]

現在我試圖把我的manager_list表,並將其與時間比較表只保留在manager_list中具有相同名稱的條目。但是,我似乎無法弄清楚如何做到這一點。我一直在空桌子。

我現在所擁有的是manager_hours = [i for i in hours if get(0,i) in manager_list]但它不起作用,我無法弄清楚如何比較兩者。

我期待的最終結果是[['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只列出了一組相同的「名「和長度,你可以做的一件事就是使用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]]