2017-01-28 47 views
0

我有一個列表的列表,其中包含座標的Python 3:如何檢查是否從列表中的產品列表中,並打印

points = [[5821, 293], [3214, 872], [4218, 820], [1223, 90], [7438, 820]] 

,我需要找到對名單具有相同點[I] [1]然後打印兩者。這個座標只是舉例。在代碼中,它們是隨機給出的。 如何做到這一點?

+1

你能澄清你的意圖一點? –

+0

您正在嘗試使用相同的y值查找所有座標,然後打印它們? – byxor

+0

@BrandonIbbotson是的。我是編程新手,還不知道很多 –

回答

1

您可以使用itertools.combinations創造了一系列各兩個項目之間的配對,只有過濾掉那些具有相同的第二項:

from itertools import combinations 
result = [x for x in combinations(points, 2) if x[0][1] == x[1][1]] 
+0

如果我不被允許使用itertools? –

+0

你可以用一對嵌套循環和一個常規的'if'語句來做同樣的事情。 – Blckknght

0

不知道我理解正確的問題,但這裏是我的方法。

我用蟒蛇3.5.2,順便說一句。

如果你的目的是爲了捕捉[1]或y座標(取決於你如何看待它)與820的值,則該代碼可能是所有列表:

for i in points: 
    if i[1] == 820: 
     print(i) 
+0

我猜測OP不想只捕獲820的y座標。它應該是更一般的。 – pushkin

+0

或類似的東西: 我爲分: 爲j分: 如果我[1] == j [1]和i!= j: print(j) – erickkuhni

0

有沒有簡單而有效的方式來做你想用你當前的數據結構。

您可以使用低效的方法(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對匹配)。

0

這裏是代碼,會爲你工作:

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,看看有沒有重複的點。如果是這樣,我們打印整個事情。我希望有所幫助。

相關問題