2013-04-29 4 views
0

2D 배열에서 중복 된 부분을 검색하는 방법을 찾고 있습니다. 어떤 방법은 중복 영역을 검색하고 좌표를 저장 자동으로2D 배열에서 중복 값 검색

1 2 3 4 5 
6 7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 
21 22 23 24 25 
26 *8 9* 29 30 
31 *13 14 15* 35 
17 *18 19* 39 40 
41 *23 24* 44 45 
46 47 48 49 50 

있을 수 있습니다 :

예를 들어 아래의 배열을 복용?

답변

0

이전 항목을 모두 소장품으로 유지하십시오. 배열을 반복하면서 각 요소가 이미 카운터 클래스에 있는지 확인하고, 카운터 클래스에 좌표를 추가하고 계속 진행합니다. 그렇지 않은 경우 특정 숫자의 카운터를 증가시킵니다.

1
>>> l=[[1, 2, 3, 4, 5], 
... [6, 7, 8, 9, 10], 
... [11, 12, 13, 14, 15], 
... [16, 17, 18, 19, 20], 
... [21, 22, 23, 24, 25], 
... [26, 8, 9, 29, 30], 
... [31, 13, 14, 15, 35], 
... [17, 18, 19, 39, 40], 
... [41, 23, 24, 44, 45], 
... [46, 47, 48, 49, 50]] 
>>> seen = set() 
>>> dupes = {} 
>>> for i_index, i in enumerate(l): 
...  for j_index, j in enumerate(i): 
...   if j in seen: 
...    dupes[(i_index, j_index)] = j 
...   seen.add(j) 
... 
>>> for coord, num in dupes.iteritems(): 
...  print "%s: %s" % (coord, num) 
... 
(7, 0): 17 
(8, 2): 24 
(7, 1): 18 
(8, 1): 23 
(6, 1): 13 
(6, 3): 15 
(6, 2): 14 
(5, 1): 8 
(5, 2): 9 
(7, 2): 19 
+0

반복되는 항목이 여러 개인 경우 좌표가 있으면이 기능이 작동합니까? –

+1

@RyanSaxe 사전 키는 좌표 쌍이므로 전체 배열이 동일한 값으로 채워질 수 있고 첫 번째 이후의 각 좌표 쌍을 속량 사전의 별도 항목으로 저장합니다. –

0

dict을 사용하십시오. 여기서, 키는 숫자이고 목록에있는 좌표를 저장합니다.

In [171]: lis 
Out[171]: 
[[1, 2, 3, 4, 5], 
[6, 7, 8, 9, 10], 
[11, 12, 13, 14, 15], 
[16, 17, 18, 19, 20], 
[21, 22, 23, 24, 25], 
[26, 8, 9, 29, 30], 
[31, 13, 14, 15, 35], 
[17, 18, 19, 39, 40], 
[41, 23, 24, 44, 45], 
[46, 47, 48, 49, 50]] 

In [172]: from collections import defaultdict 

In [173]: dic=defaultdict(list) 

In [174]: for i,x in enumerate(lis): 
    for j,y in enumerate(x): 
     dic[y].append((i,j)) 
    .....:   

In [175]: for num,coords in dic.items(): 
    if len(coords)>1: 
     print "{0} was repeated at coordinates {1}".format(num, 
              " ".join(str(x) for x in coords)) 
    .....:   
8 was repeated at coordinates (1, 2) (5, 1) 
9 was repeated at coordinates (1, 3) (5, 2) 
13 was repeated at coordinates (2, 2) (6, 1) 
14 was repeated at coordinates (2, 3) (6, 2) 
15 was repeated at coordinates (2, 4) (6, 3) 
17 was repeated at coordinates (3, 1) (7, 0) 
18 was repeated at coordinates (3, 2) (7, 1) 
19 was repeated at coordinates (3, 3) (7, 2) 
23 was repeated at coordinates (4, 2) (8, 1) 
24 was repeated at coordinates (4, 3) (8, 2) 
+0

@downvoter 신경 쓰지 마세요. –

0

질문을 올바르게 이해하면 일련의 중복 된 값을 찾을 수있을뿐만 아니라 일련의 값을 찾아야합니다. 예를 들어 [1,2,3,4] 일 경우 [39,87,2,3,4]에서 [2,3,4]의 사본을 찾을 수 있습니다.

수입 및 테스트 값

import itertools,pprint 
from collections import defaultdict 
l = ((1, 2, 3, 4, 5), 
(6, 7, 8, 9, 10), 
(11, 12, 13, 14, 15), 
(16, 17, 18, 19, 20), 
(21, 22, 23, 24, 25), 
(26, 8, 9, 29, 30), 
(31, 13, 14, 15, 35), 
(17, 18, 19, 39, 40), 
(41, 23, 24, 44, 45), 
(46, 47, 48, 49, 50)) 

홈페이지 코드 :

seen = defaultdict(dict) 
for y,row in enumerate(l): 
     rowlen = len(row) 
     values = [ [ (row[i:k+1]) for (i,k) in zip(range(rowlen),range(e,rowlen,1))] for e in range(rowlen) ] 
     for valueGroup in values: 
      for x,value in enumerate(valueGroup): 
       seen[value]['count'] = seen[value].get('count',0) + 1 
       seen[value]['x-coOrd'] = x 
       seen[("R",y)][value] = True 

for y in range(len(l)): 
    my_rows_vals = seen[("R",y)].keys() 
    for value in my_rows_vals: 
     if seen[value]['count'] > 1: 
      print "{0} repeated at ({1},{2})".format(value,seen[value]['x-coOrd'],y) 

윌 출력, 샘플로 (이상의 출력이 있었다) : 목록의 이해 논리였다

(13, 14) repeated at (1,6) 
(14, 15) repeated at (2,6) 
(13,) repeated at (1,6) 
(13, 14, 15) repeated at (1,6) 
(14,) repeated at (2,6) 
(17, 18) repeated at (0,7) 
(18, 19) repeated at (1,7) 
(17,) repeated at (0,7) 
(18,) repeated at (1,7) 
(19,) repeated at (2,7) 
(17, 18, 19) repeated at (0,7) 
(23,) repeated at (1,8) 
(24,) repeated at (2,8) 
(23, 24) repeated at (1,8) 

이 예를 근거로 추론 한 것

l = [1,2,3,4] 
len = 4 
i:k 
0:1 1:2 2:3 3:4 i = 0,1,2,len-e k = e,e+1,e+2,e+3 e = 0 
0:2 1:3 2:4  i = 0,1,len-e k = e,e+1,e+2  e = 1 
0:3 1:4   i = 0,len-e  k = e,e+1   e = 2 
0:4    i = len-e  k = e    e = 3 

이 방법은 숫자와 숫자로 구성된 시퀀스을 모두 확인하고 일치하는 부분을 강조 표시하므로 다른 답변과 다릅니다.