簡體   English   中英

根據某些標准查找列表的共同元素?

[英]Finding common elements of a list based on some criteria?

輸入是元組列表的形式,

left_corners = [((380, 456), 1), ((1129, 456), 2), ((354, 328), 3), ((1137, 325), 4)]
right_corners = [((784, 456), 1), ((1535, 456), 2), ((778, 328), 3)]

共同元素將是元組的第二個元素為1, 2, 3所以我希望最終表示看起來像 -

[(((380, 456), 1),((784, 456), 1)), (((1129, 456), 2),((1535, 456), 2)), (((354, 328), 3), ((778, 328), 3))]

我想不出沒有幾個循環的解決方案(循環兩個元素並在公共列表中附加具有相同第二個元素的元素)。 有沒有更蟒蛇的方式? 我對 numpy 或其他內容的其他表示持開放態度。

假設:我們可以假設兩個列表都是排序的,鍵是列表的第二個元素,但是left_cornersright_corners可能比另一個有更多的元素

如果你使用字典,你可以做一些更有效率的事情

group_lists = {}
for corner in (left_corners+right_corners):
  group_lists[corner[1]] = group_lists.get(corner[1], [])
  group_lists[corner[1]].append(corner)

output = [group_lists[k] for k in group_lists]

如果您希望 output 成為元組列表而不是列表列表,則只需將最后一行更改為

output = [tuple(group_lists[k]) for k in group_lists]
first, second = (left_corners, right_corners) if len(left_corners) > len(right_corners) else (right_corners, left_corners)

[(i, j) for i in first for j in second  if i[1] == j[1]]

我假設第二個元素(統一元組的關鍵)可以是任何東西1, 2, 3

另一個假設是第二個元素已排序但可以跳過數字,例如,如果不是這種情況,那么zip是 go 的方式。

left_corners = [(X, 1), (Y, 2), (Z, 3)]
right_corners = [(A, 1), (B, 3)]

也許(不確定,因為問題沒有很清楚地說明)這就是你想要的:

good_corners = [ [ t for t in corners if t[1] in {1,2,3}] for corners in (left_corners, right_corners) ]
result = list(zip(*good_corners))

列表理解怎么樣?

a = [k for k in left_corners if k[1] in [1,2,3]] + [k for k in right_corners if k[1] in [1,2,3]]

output:

[((380, 456), 1), ((1129, 456), 2), ((354, 328), 3), ((784, 456), 1), ((1535, 456), 2), ((778, 328), 3)]

這僅在排序無關時才有效。 如果需要排序,您可以使用 lambda function 進行排序:

sorted(a, key=lambda x: x[1])

output:

[((380, 456), 1), ((784, 456), 1), ((1129, 456), 2), ((1535, 456), 2), ((354, 328), 3), ((778, 328), 3)]

這對我來說效果很好

combined_list = list(zip(left_corners, right_corners))

暫無
暫無

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

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