我使用了 scipy.spatial.KDTree.query_pairs() ,它回傳了一組 Python 元組。假設,這是輸出:
set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}
接下來,我想洗掉集合中所有不滿足條件的元組
arr = [6, 7]
tuple[0] in arr or tuple[1] in arr
什么是最優雅/快速/pythonic 的方式?我應該轉換為 numpy 陣列嗎?
uj5u.com熱心網友回復:
您需要迭代并檢查每個元組set1,您可以使用集合理解來做到這一點,并且any():
>>> set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}
>>> arr = [6, 7]
>>> set2 = set(arr) # convert to set for O(1) lookup time
>>> set3 = {t for t in set1 if any(x in set2 for x in t)}
>>> set3
{(6, 7), (6, 8), (1, 6)}
uj5u.com熱心網友回復:
解決這個問題的一種方法是遍歷集合并為滿足條件的元素創建一個陣列,然后將陣列轉換為一個集合。
這可以通過單行解決方案來完成,例如:
set2 = set([a for a in set1 if a[0] not in key and a[1] not in key])
uj5u.com熱心網友回復:
希望這是你正在尋找的
filtered = [x,y for x,y in set1 if (x,y) == (6,7)]
或者嘗試將 lambda 用于復雜的過濾器。
uj5u.com熱心網友回復:
無需將您的資料轉換為numpy陣列,這就是我解決此問題的方法:
set1 = {(2, 3), (4, 5), (1, 6), (6, 7), (3, 8), (6, 8)}
arr = [6, 7]
filtered = list(filter(lambda xy: bool(set(xy) & set(arr)), set1))
如果set1 中元素的長度顯著增加并且您決定使用numpy,那么我將更改numpy的intersect1d的集合交集
如果set1的長度反而增加,那么我建議您查看其他StackOverflow 帖子,了解如何過濾 numpy 陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383409.html
上一篇:分解每一列資料框而不重復資料
下一篇:矩陣對角線上的亂數(可能重復)
