2013-07-09 4 views
0

다른 행의 값을 비교해야합니다. 각 행은 사전이고 인접한 행의 값을 키 '플래그'와 비교해야합니다. 어떻게하면 좋을까요? 간단히 말씀 : 'int' object is not subscriptable 범위는 INT의 목록을 반환하더라도중복 된 항목을 제거 하시겠습니까?

... 댓글


응답 : 행의

목록이입니다

for row in range(1,len(myjson)):: 
     if row['flag'] == (row-1)['flag']: 
      print yes 

는 형식 오류를 반환 사전 목록. 원래 탭으로 구분 된 파일을 가져 와서 csv.dict 모듈을 사용하여 읽었습니다. 변수 이름에 해당하는 키가있는 사전 목록이됩니다. 또한

{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''} 
{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': '[email protected]'} 
{'website': '', 'phone': '', 'flag': 2, 'name': 'Argle D. Bargle Ed.M.', 'email': ''} 
{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'} 
{'website': '', 'phone': '', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': ''} 
{'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'} 
{'website': '', 'phone': '', 'flag': 4, 'name': 'D G Bamf M.S.', 'email': ''} 
{'website': '', 'phone': '', 'flag': 5, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''} 

:

for row in myjson: 
    print row 

출력 (myjson는 사전의 목록입니다) :

코드

type(myjson) 

<type 'list'> 
+0

list_of_rows의 데이터 유형은 무엇입니까? – Sheng

+3

'TypeError'를 얻는다면,'list_of_rows'는 사전을 포함하지 않을 것입니다. –

+0

'TypeError'는 어떤 줄부터 시작됩니까? 나는'row'가'int' (계산은 성공하지만'int'는 subscriptable이 아님)를 의미하는'(row-1) [ 'flag']'라고 내기 때문에'list_of_rows'는 반복 가능합니다 ints의. –

답변

1

귀하의 예외는 list_of_rows 당신이 생각하는 것 없음을 나타냅니다.

for i, row in enumerate(list_of_rows): 
    previous = list_of_rows[i - 1] if i else None 
    next = list_of_rows[i + 1] if i + 1 < len(list_of_rows) else None 
+0

내가 뒤에서 바라보고 있으면 첫 행을 어떻게 다룰 수 있습니까? – goldisfine

+1

은 귀하에게 달려 있습니다. 원하는 경우 이전 행이 없으면 첫 번째 행을 건너 뜁니다. –

+0

'행'을 인쇄 할 때 숫자 목록을 제공한다는 점을 감안할 때 왜 이것이 작동하지 않는지 혼란 스럽습니다. 내 수정 된 코드에서, 내 for 루프는 this : range (1, len (myjson)) – goldisfine

2

인접한 항목을 비교 당신은 zip 사용할 수 있습니다

예 : 사전의 목록을 위해

>>> lis = [1,1,2,3,4,4,5,6,7,7] 
for x,y in zip(lis, lis[1:]): 
    if x == y : 
     print x,y,'are equal' 
...   
1 1 are equal 
4 4 are equal 
7 7 are equal 

, 당신이 뭔가를 할 수 있습니다

from itertools import izip 
it1 = iter(list_of_dicts) 
it2 = iter(list_of_dicts) 
next(it2) 
for x,y in izip(it1, it2): 
     if x['flag'] == y['flag'] 
      print yes 

업데이트 : 당신이 itertools.groupby을 사용할 수있는 2 개 이상의 인접 항목의

:

>>> lis = [1,1,1,1,1,2,2,3,4] 
for k,group in groupby(lis): 
    print list(group) 

[1, 1, 1, 1, 1] 
[2, 2] 
[3] 
[4] 
코드210

은은 다음과 같습니다

>>> for k, group in groupby(dic, key = lambda x : x['flag']): 
...  print list(group) 
...  
[{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''}] 
[{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': '[email protected]'}] 
[{'website': '', 'phone': '', 'flag': 2, 'name': 'Argle D. Bargle Ed.M.', 'email': ''}] 
[{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'}, {'website': '', 'phone': '', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': ''}, {'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'}] 
[{'website': '', 'phone': '', 'flag': 4, 'name': 'D G Bamf M.S.', 'email': ''}] 
[{'website': '', 'phone': '', 'flag': 5, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''}] 
+2

이렇게하면 목록이 많이 생성됩니다. 목록이 크면 상당히 문제가 될 수 있습니다. –

+0

@MartijnPieters izip 및 iterators를 사용하여 처리 할 수 ​​있습니다. –

+0

2 개 이상 (예 : [1,1,1,1,2,2,3,4]) – goldisfine

1

의 모습 :

다른 인접한 행 보는

list_of_rows은 참으로 목록, 나는 현재 인덱스를 포함하는 enumerate()를 사용하고 다음 및 이전 행을로드하는 인덱스를 사용하십시오 제공 당신은 일괄 목록 요소에 액세스하려면 :
http://code.activestate.com/recipes/303279/

0
list_of_rows = [ { 'a': 'foo', 
        'flag': 'bar' }, 
       { 'a': 'blo', 
        'flag': 'bar' } ] 
for row, successor_row in zip(list_of_rows, list_of_rows[1:]): 
    if row['flag'] == successor_row['flag']: 
     print "yes" 
1

당신이

을 시도 할 수
pre_item = list_of_rows[0]['flag'] 
for row in list_of_rows[1:]: 
     if row['flag'] == pre_item : 
      print yes 
     pre_item = row['flag'] 
0

간단합니다.귀하의 게시물 제목이 암시 하듯이 ("귀하의 사전이 엄밀히 말하면 중복이 아니기 때문에 오해의 소지가 있습니다") 키 "플래그"에 대해 동일한 값을 가진 사전을 제거해야하는 경우 사전 전체 목록을 반복 할 수 있습니다 목록의 값으로 호출 할 때

def filterDicts(listOfDicts): 
    result = [] 
    flags = [] 
    for di in listOfDicts: 
     if di["flag"] not in flags: 
      result.append(di) 
      flags.append(di["flag"]) 
    return result 

: 별도의 목록에 플래그를 추적, 항목이 플래그 목록에 이미 플래그가있는 경우 간단하게 추가하지 마십시오, 그것은 같이 보일 것이다 귀하가 제공 한 사전 중에서 5 개의 항목이있는 목록을 반환하며 각 항목에는 플래그의 고유 한 값이 있습니다.

관련 문제