2015-02-01 2 views
0

파일을 반복하면서 다음에 오는 개체가 현재 개체와 같은지 확인하고 싶습니다. 좋아파이썬 루프에서 다음 값이 현재 값과 같은지 확인하십시오?

Oba_A 
Obj_B 
Obj_C 
Obj_D 

내가 그들을 통해 반복하고 있습니다 :

for obj in open("file.txt"): 
    check if Obj_A.name==Obj_B.name, if not: 
     if Obj_B.name==Obj_C.name 

파일이 포함 : 두 개체는 Obj.name

같은 속성 이름 여기

몇 가지 간단한 예이다가 나는 프로그래밍을 배우는 생물 학자이다. 나는 여기에 충분한 격려를 얻길 바랍니다. 마지막으로 개체의

+0

이 내용이 파일의 내용입니까? 물건은 어디에 있니? 이들은 단지 ** 다른 ** 문자열입니다. 예상되는 입력과 출력을 게시하면 도움이 될 수 있습니다. –

+0

그것은 실제로 파일의 각 행에 무엇이 있는지와 객체 검사의 최종 용도가 무엇인지에 달려 있습니다. – chris

+0

나는 여기에 나와 있지 않은 파일을 읽고 객체를 만들고있다. – gthm

답변

3

, 기본적인 대답은 다음과 같을 수 있습니다 : 그것은 자동으로 닫로 파일을 열 수있는 보조 노트 사용 with

:

last_value = None 
for obj in collection: 
    if obj.name == last_value: 
     # do something 
    else: 
     # do something different 
    last_value = obj.name 

업데이트 : 당신이 원하는 경우 회와 일치를 기반으로 최초의 객체에 관한 법률에 그것이 진정으로 "현재"와 "다음"이러한 생각 도움이된다면,

prev_obj = None 
for obj in collection: 
    if obj.name == prev_obj.name: 
     # do something with prev_obj 
    else: 
     # do something different 
    prev_obj = obj 

또는 : : 전자 다음 개체, 당신은 전 그냥 이름 대신 이전 객체에 대한 참조를 저장할 수

cur_obj = None 
for next_obj in collection: 
    if next_obj.name == cur_obj.name: 
     # do something with cur_obj 
    else: 
     # do something different 
    cur_obj = next_obj 

하지만 내가 한 모든 작업이 이름이 변경되었음을 주목하십시오. 절차는 여전히 동일합니다.

추가 업데이트 : 루프를 처음 사용할 때 prev_obj는 None이므로 name 특성을 갖지 않습니다. 대문자로 변경하려면

prev_obj = None 
for obj in collection: 
    if prev_obj is not None and obj.name == prev_obj.name: 
     # do something with prev_obj 
    else: 
     # do something different 
    prev_obj = obj 
+0

이것이 작동하는 것 같습니다. 감사. – gthm

+0

비슷하지만 다음 값을 현재 값 대신 이전 값과 비교할 수 있습니까? 마찬가지로 우리는 last_value를 초기 값으로 만들고 다음 값과 비교할 수 있습니까? – gthm

+0

다음 객체 대신 이전 객체에 대한 응답을 업데이트했습니다. 논리적으로 시퀀스의 인접한 두 항목을 비교하는 방법에는 차이가 없습니다 ...하지만 컬렉션에서 문자 그대로 "앞을 내다"는 코드 복잡성이 증가하고 컬렉션 멤버에 액세스 할 것이므로 성능이 크게 저하 될 수 있습니다 두 가지 다른 방법. 불가능하지는 않지만, 처음 시작하는 경우, 먼저 "올바른"방식으로 받아 들여야합니다. – dylrei

2

보관할 트랙 우리는보고가 현재 Object와 비교 :

objects = ([....]) 
prev = objects[0] 
for obj in objects[1:]: 
    if prev.name == obj.name: 
     # do whatever 
    else: 
     # do something else 
    prev = obj # update prev to current obj 

을 객체가 반복자의 어떤 종류 또는 참으로 남아있는 객체를 통해 그럼 그냥 루프를 시작하는 파일 객체 사용 prev = next(objects) 인 경우. 텍스트 파일에서 개체를 얻고있는 방법의 문제를 바라 보는

with open("file.txt") as f: 
    prev = next(f) 
    for obj in f: 
     # create objects 
     if prev.name == obj.name: 
      # do whatever 
     else: 
      # do something else 
     prev = obj 
+0

'start'라는 이름을 사용하는 것이 혼란 스럽습니다. 왜 그 이름을 '이전'또는 '선행'이라고 지으려고합니까? –

+0

@MartijnPieters, 이것은 모든 연속적인 요소를 테스트합니다 –

+0

@MartijnPieters, 잘 시작 객체이기 때문에 이전에 그것을 호출하는 것이 정확하지 않을 수도 있습니다.어떤 식 으로든 코드는 OP가 원하는 것을 수행하고 효율적으로 수행합니다. –

관련 문제