我有一個列表的列表,其中包含座標的Python 3:如何檢查是否從列表中的產品列表中,並打印
points = [[5821, 293], [3214, 872], [4218, 820], [1223, 90], [7438, 820]]
,我需要找到對名單具有相同點[I] [1]然後打印兩者。這個座標只是舉例。在代碼中,它們是隨機給出的。 如何做到這一點?
我有一個列表的列表,其中包含座標的Python 3:如何檢查是否從列表中的產品列表中,並打印
points = [[5821, 293], [3214, 872], [4218, 820], [1223, 90], [7438, 820]]
,我需要找到對名單具有相同點[I] [1]然後打印兩者。這個座標只是舉例。在代碼中,它們是隨機給出的。 如何做到這一點?
您可以使用itertools.combinations創造了一系列各兩個項目之間的配對,只有過濾掉那些具有相同的第二項:
from itertools import combinations
result = [x for x in combinations(points, 2) if x[0][1] == x[1][1]]
如果我不被允許使用itertools? –
你可以用一對嵌套循環和一個常規的'if'語句來做同樣的事情。 – Blckknght
不知道我理解正確的問題,但這裏是我的方法。
我用蟒蛇3.5.2,順便說一句。
如果你的目的是爲了捕捉[1]或y座標(取決於你如何看待它)與820的值,則該代碼可能是所有列表:
for i in points:
if i[1] == 820:
print(i)
我猜測OP不想只捕獲820的y座標。它應該是更一般的。 – pushkin
或類似的東西: 我爲分: 爲j分: 如果我[1] == j [1]和i!= j: print(j) – erickkuhni
有沒有簡單而有效的方式來做你想用你當前的數據結構。
您可以使用低效的方法(O(N**2)
),或您的數據轉換爲另一種格式,你可以使用更有效的算法。
Mureinik's answer是做一個O(N**2)
尋找一個好辦法,所以我會提供一個使用字典,使檢查快速的解決方案:
def find_matches(points):
dct = {}
for x, y in points:
for other_x in dct.setdefault(y, []):
yield (x, y), (other_x, y)
dct[y].append(x)
這是一臺發電機,這將yield
雙點與匹配的y
值。它應該使用O(N)
空間和O(N+R)
時間(N
輸入點和R
對匹配)。
這裏是代碼,會爲你工作:
second_list = []
the_list = [[5821, 293], [3214, 872], [4218, 820], [1223, 90],
[7438, 820]]
for i in the_list:
second_list.append(i[1])
repeated = []
the_new_list = sorted(second_list, key=int)
for i in range(len(the_new_list)):
if i + 1 < len(the_new_list):
if the_new_list[i] == the_new_list[i+1]:
repeated.append(the_new_list[i])
for i in the_list:
if i[1] in repeated:
print(i)
second_list商店列表的y座標。然後,程序按升序對y座標列表進行排序並將它們附加到the_new_list。最後,我們循環遍歷the_new_list,看看彼此之後的數字是否相等,如果是,則將它們追加到重複列表中。然後,我們遍歷the_list,看看有沒有重複的點。如果是這樣,我們打印整個事情。我希望有所幫助。
你能澄清你的意圖一點? –
您正在嘗試使用相同的y值查找所有座標,然後打印它們? – byxor
@BrandonIbbotson是的。我是編程新手,還不知道很多 –