簡體   English   中英

如何基於元組中的值獲取元組列表中的項目

[英]how to get items in a list of tuple based on the value in tuple

我得到了一個組合的數據列表,並使用zip函數對其進行了排序

comb_list = sorted(zip(score_list, move_list), key = lambda pair: pair[0], reverse = True)

輸出是這樣的

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), 
(1, (6, 2, False)), (-1, (6, 2, False))] 

我想按元組中的第一個元素排序(在列表中),找到最大值,然后輸出元組中的第二個元素。 這里的最大值是3,輸出將是

[(5, 4, False), (6, 4, False)]

或者如果我有

a = [(3, (5, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

和輸出將是

[(5, 4, False)]

除了對整個列表進行排序然后進行過濾之外,還有其他更有效的方法,但是由於您已經按關鍵字對整個列表進行了排序,並且大概已經了解了它的工作原理,所以讓我們從這里開始:

a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)), (1, (6, 2, False)), (-1, (6, 2, False))] 

因此,現在,您只想過濾其密鑰與頂部密鑰相同的密鑰:

b = [(key, value) for key, value in a if key == a[0][0]]

…除了您只需要value而不是(key, value)對,這很簡單:

b = [value for key, value in a if key == a[0][0]]

現在,為什么效率低下? 好吧,如果您已經對列表進行了排序,則實際上並不需要檢查每個值。 一旦發現不匹配的內容(例如,使用itertools.takewhile ),就可以跳出循環。 但是,更簡單地說,您不需要首先進行排序; 只需獲取max ,然后使用它進行過濾:

comb_list = list(zip(score_list, move_list))
comb_max = max(comb_list, key=lambda pair: pair[0])
b = [value for key, value in comb_list if key==comb_max[0]]

或者,甚至更好的是,您甚至不需要構建中間列表,因為max根本不需要zip 這也使事情更容易理解:

max_score = max(score_list)
b = [move for score, move in zip(score_list, move_list) if score == max_score]

使用列表理解:

a = [(5, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)),(1, (6, 2, False)), (-1, (6, 2, False))]
filtered = [p[1] for p in a if p[0] >= max([x[0] for x in a])]

一種非常簡單且pythonic的解決方法

>>> max_value = max(a, key=lambda x:x[0])[0]
>>> max_value
3
>>> [x[1] for x in a if x[0]==max_value]
[(5, 4, False), (6, 4, False)]

您可以將最大內置方法與key一起使用:

 >>> a = [(3, (5, 4, False)), (3, (6, 4, False)), (2, (5, 1, False)),
... (1, (6, 2, False)), (-1, (6, 2, False))]
>>> max([(x,list(y)) for x,y in itertools.groupby(sorted(a, key=lambda x:x[0]), key=lambda x:x[0])], key=lambda x:x[0])
(3, [(3, (5, 4, False)), (3, (6, 4, False))])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM