2012-08-03 2 views
0

각 목록의 마지막 요소로 정수를 포함하는 중첩 목록이 있고 목록의 다음 항목이 현재 항목보다 하나 더 많은지 확인하려고합니다. 즉 현재 목록의 마지막 요소가 104이고, 다음 목록의 마지막 요소가 105라면, 무엇인가를하십시오.목록 항목을 비교하는 추가 사용

data=[[a,b,c,1200],[a,g,x,3401],[f,a,c,3402],[f,a,c,3403]etc] 
for item in data: 
    if next(item[-1])==item[-1]+1: #if next item is this item plus one 
     #do something 

TypeError: Can't convert 'int' object to str implicitly을 제기 유지하고 그 이유를 모른다. 파이썬에서 목록 요소를 비교하기 위해 추가 기능을 사용할 수 있습니까?

(내가) (다음하지 전체 코드의 이전 및 다음 항목을 얻을 수있는 기능을 사용하고 있습니다으로 다음 (항목) 부분은 정확하지 않을 수도 있지만 원칙적으로 동일)

답변

1

원하는대로 할 수 있습니다.


next(item[-1])

data=[[a,b,c,1200],[a,g,x,3401],[f,a,c,3402],[f,a,c,3403]etc] 
previous = 0 # adjust if necessary 
for item in data: 
    if item[-1] == previous + 1: 
     #do something 
    previous = item[-1] 

는 생각하지 않습니다. 당신이 item을 통과한다면, next(), 즉 item
    1. next(), 당신이 원하는 "다음"요소에 실제 전구체를 수신하지 않습니다 : 당신은 몇 가지 추론을 적용하여이 자신을 추론 할 수 item이 어떤 목록인지 파악해야합니다.
    2. item이 여러 목록에 있으면 어떻게됩니까? 동일한 목록에서 여러 번 발생하면 어떻게됩니까? 반환 할 항목은 무엇입니까?

    당신이 볼 수 있듯이, 단순히 일부 목록의 일부가 될 일이 어떤 임의의 객체를 전달하여 목록에서 다음 항목을 가져 오기 할 수있는 방법이 없습니다.

    실제로 next()이하는 것은 상당히 다릅니다. iterator/generator에서 생성 된 다음 항목을 제공합니다.

  • +0

    감사합니다. 그러나 이것은 여전히 ​​발생합니다 TypeError : 암시 적으로 'int'객체를 str으로 변환 할 수 없습니다. – Snaaa

    +0

    @Snaa : 그러면 '데이터'가 내 코드에 표시되지 않습니다. 'item [-1]'을'int()'로 감쌀 필요가 있습니다. – phant0m

    +1

    @Snaaa : '데이터'의 마지막 요소가 실제로 정수가 아닌 것은 가능합니까? –

    0

    유형을 올바르게 변환해야합니다. 그냥

    if int(item[0]) == int(item[1]) + 1: 
    

    이 변환이 실패 할 경우 ValueError을 잡으려고 준비를하지 않는 이유

    if int(next(item[-1])) == int(item[1]) + 1: 
    

    또한, 내가 이해하지 못하는거야.

    +0

    고마워요! 중첩 된 목록의 마지막 요소를 중첩 된 목록의 다음 목록의 마지막 요소와 비교하려고합니다. 따라서 next()입니다.int()가 추가됩니다 ValueError : 밑이 10 인 int()에 대한 리터럴이 올바르지 않습니다 : 'Unique \ n' – Snaaa

    2

    귀하의 오류 메시지는 item[-1]을 의도 한 곳인 item[1]을 사용했기 때문입니다. 그러나이를 수정하면 코드가 수정되지 않습니다. next(item[-1])은 의미가 없습니다. 나는 itertools.groupby()를 사용하여이 루프를 리팩토링하는 것이 좋습니다 것 :

    from itertools import groupby, count 
    c = count() 
    for key, group in groupby(data, lambda x: x[-1] - next(c)): 
        for item in group: 
         # whatever 
    

    이것은 하위 목록의 마지막 요소에 정수의 연속 실행의 그룹으로 data을 분할합니다. 각 내부 루프는 별도의 연속 실행을 통해 실행되며 필요할 경우이 내부 루프 앞에 설정 코드를 추가 할 수 있습니다.

    +0

    오타, 오타입니다. [-1]이어야합니다. 나는 http://stackoverflow.com/questions/1011938/python-previous-and-next-values-inside-a-loop에서 nosklo의 대답을 사용하여 다음 항목을 얻는다. – Snaaa

    +0

    @Snaaa : 나의 대답은 그 점이다. 연속 실행을 감지하기 위해 이전 항목과 다음 항목에 액세스 할 필요가 없기 때문에 오타와 상관없이이 대답은 문제를 해결하기위한 대체 방법을 제공해야합니다. –

    +1

    와우,'groupby'와'count'의 놀라운 용도. 놀랄 만한. –

    관련 문제