[英]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.