2013-01-14 7 views
1

저는 파이썬 GAE에서 작업하고 있습니다.튜플 목록 (이 경우 목록의 튜플 하나)에서 값을 추출합니다.

이유는 내가 튜플에서 [index]을 사용하여 값을 추출 할 수없는 이유를 알 수 없습니다. 로그에서 내 leveloneAdd 변수에 값이 있음을 알 수 있습니다. ('english', 'subject') - 그러나 내 튜플 1을 반복 할 때 taghtype 변수가 비어 있습니다. tag = 'english'htype = 'subject'을 기대하고 있습니다.

누구든지 어떤 생각이 있습니까? 모든 입력을위한 감사 : 내 로그

for each in leveloneAdd: 
    tag = each[0] 
    htype = each[1] 
    q1 = Level_1_Headings.all().filter("name1 =",tag).filter("heading_type =",htype).get() 

그래서 내가 여기 마티가 제안 로그에에 repr를하고 있습니다! 이 보드를 사랑 - 여기 마티에서 제안을 사용하여 내 로그

INFO  2013-01-14 19:28:17,030 main.py:291] each is ('math', 'subject') 
INFO  2013-01-14 19:28:17,030 main.py:292] u"('math', 'subject')" 
INFO  2013-01-14 19:28:17,030 main.py:294] tag is (
INFO  2013-01-14 19:28:17,030 main.py:296] heading type is ' 

그것은 문자열과 같은 문자열로보고있는 --- 나는 그것이 문자열처럼 전체를 해석하는 생각 ---입니까? 어떻게 이것을 진정한 튜플 (true tuple)로 읽기로 변환 할 것인가? 튜플이 만들어지기 시작한 원래 코드는 다음과 같습니다 (클라이언트로 이동 한 다음 로그에 표시된대로 다시 돌아옵니다).

for h1 : listone.append ((str (x. NAME1), STR (x.heading_type)))

상기

값은 입력 선택 드롭 박스 형태 에 다음 서버 측 파이썬 - 난
leveloneAdd = (self.request.get_all으로 값을 얻는 ("list_uno []"))

죄송합니다. 기본 질문 인 것처럼 보이면 죄송합니다. 초보자입니다.

+3

로그'에 repr (leveloneAdd)'대신 있는지 확인하기 참으로 튜플입니다. –

+2

'leveloneAdd == ('english', 'subject') '이면'each'가 먼저 영어가되고'subject '가됩니다. –

+1

정확히 @ F.C. 고 밝혔다. –

답변

2

leveloneAdd == ('english', 'subject')이 경우 튜플 목록이 아니며 루프의 반복마다이 문자열로 간주되므로 튜플이됩니다. 내부 튜플과 목록입니다 leveloneAdd == [('english', 'subject')] 경우

코드는 잘 작동합니다.

당신이 할 수있는 최선의 방법은 leveloneAdd가 항상 튜플의 목록이되도록 코드를 수정하는 것입니다. 그렇게 할 수 없다면 leveloneAdd가 목록 일 때 그것을 수정해야합니다. 두 개의 문자열을 가진 튜플. 그런 종류의 전환을 처리 할 때 실수를하기 쉽기 때문에 모든 입력을 테스트하여 조심하십시오.

docs에서 get_all은 목록을 반환해야한다고 말하면 하나 이상의 인수가있는 경우에만 목록을 반환 할 수 있습니다. 그건 그냥 함께 leveloneAdd의 값을 분할 한 후

if isinstance(leveloneAdd, basestring): 
    leveloneAdd = [leveloneAdd] 

또한 여분을 피하기 위해 자바 스크립트를 조정 ','

을 : 그런 경우가 문자열 인 경우 당신은 목록에 값을 변환 할 수 있습니다 "("와 " '"와 같은 문자

+0

위대한 - 일했다. – user1769203

1

이 시도 :

for (tag, htype) in leveloneAdd: 
    # stuff 

을가 튜플이 아닌 경우, 당신은 오류 "를 풀고 너무 많은 값"같은 것을 얻을 것이다.


나는 OP를 잘못 읽었습니다. 그런 다음 디버거를 얻을 수 있습니다

for thing in list: 
    try: 
     (tag, htype) = thing 
    except: 
     import pdb 
     pdb.set_trace() 

와 '것은'당신이 생각하는 경우, 당신은 볼 수 있습니다

나는이 같은 문제로 실행하면, 나는 보통 뭔가를하려고합니다.


OP 당 'thing'은 튜플이 아니라 유니 코드 문자열입니다. 문제를 해결하려면 문자열로 변환 한 다음 문자열을 분할하십시오. 코드는 다음과 같습니다이 가정

thing = u'(a,b)' 
[tag, htype] = str(thing).lstrip('(').rstrip(')').split(',') 

당신은 항상 두 개의 항목의 튜플을 기대하고 있습니다.

+0

OP 문제는 해결되지 않습니다. 값을 얻는 것이 더 좋은 방법이지만, 빈 값이있는 이유는 OP에게 말하지 않습니다. –

1

무엇 FC 말하는 것은 사실이다.

나는 튜플 질문 대 단일 요소에 의해 조금 혼란 스러워요. 기본적인 문제는 당신이있어 여부를 검출하는 경우 leveloneAdd의 요소로 단순 값 또는 튜플 , 당신이 추가하고자하는 것이 하나의 요소 일지라도 아마도 튜플의 목록으로 listoneAdd을 가지고 있다고 생각할 것입니다. 그것으로 당신이 목록에서 요소를 끌어 때 그 방법은, 당신은 항상 알 당신이 할 수있는 인덱스 :

listoneAdd = [('one',), ('foot',), ('three', 'pigs')] 
for element in listoneAdd: 
    print "element is " + str(element) 
    for i in range(0,len(element)): 
     print " do something with value " + element[i]` 

항복 :

element is ('one',) 
    do something with value one 
element is ('foot',) 
    do something with value foot 
element is ('three', 'pigs') 
    do something with value three 
    do something with value pigs`