2013-03-06 3 views
2

Привет всем У меня есть эта часть кода:Сравнивая строки и целое число в Python

for line in response.body.split("\n"): 
    if line != "": 
     opg = int(line.split(" ")[2]) 
     opc = int(line.split(" ")[3]) 
     value = int(line.split(" ")[5]) 
     if opg==160 & opc==129: 
      ret['success'] = "valore: %s" % (value) 
      self.write(tornado.escape.json_encode(ret)) 

У меня есть ряд, если линия типа

1362581670  2459546910990453036 156  0  30  0 

Я хочу взять только линию, где третья и четвертый элемент равны соответственно 160 и 129. Этот код не работает. Нужно ли мне делать кастинг? Я думаю, opg == 160 работает в campare int с int ...

+0

Они выглядят как вкладки, а не пробелы - это правильно? –

+1

'&' не делает то, что, по вашему мнению, делает. Используйте 'и'. –

+0

С форматированием ваших данных, произнеся 'line.split (" ")', он будет разделен только на одно место, а не на эту вкладку. Если это вызвало проблему, вы должны попытаться удалить вкладки между данными, чтобы они выглядели как '1362581670 2459546910990453036 156 0 30 0' – erdekhayser

ответ

4

Вы запутались с операторами; and is the correct boolean test, & является binary bitwise operator вместо того, чтобы:

if opg == 160 and opc == 129: 

В качестве числового оператора, оператор & имеет higher precedence than comparison operators, в то время как логические операторы имеют более низкий приоритет. Таким образом, выражение opg == 160 & opc == 129 интерпретируется как opg == (160 & opc) == 129, что, вероятно, не то, что вы хотели.

Вы можете упростить код несколько:

for line in response.body.splitlines(): 
    if line: 
     line = map(int, line.split()) 
     opg, opc, value = line[2], line[3], line[5] 
     if opg == 160 and opc == 129: 
      ret['success'] = "valore: %s" % (value) 
      self.write(tornado.escape.json_encode(ret)) 
+0

Большое спасибо! – sharkbait

2

& является операция поразрядного. Вероятно, вы хотите and. С целыми числами, то может не думаю, что это будет иметь значение

>>> True & False 
False 
>>> True & True 
True 
>>> False & False 
False 

Однако, обратите внимание, что & и and имеют different priorities.

>>> opc,opg = 160,129 
>>> opc == 160 & opg == 129 
False 
>>> opc == 160 and opg == 129 
True 

В основном, & связывает крепче, чем ==, так a == b & c == d обрабатывается как a == (b & c) == d, а не , как вы хотели.

>>> def func1(): 
...  opc,opg = 160,129 
...  opc == 160 & opg == 129 
... 
>>> def func2(): 
...  opc,opg = 160,129 
...  opc == 160 and opg == 129 
... 
>>> import dis 
>>> dis.dis(func1) 
    2   0 LOAD_CONST    3 ((160, 129)) 
       3 UNPACK_SEQUENCE   2 
       6 STORE_FAST    0 (opc) 
       9 STORE_FAST    1 (opg) 

    3   12 LOAD_FAST    0 (opc) 
      15 LOAD_CONST    1 (160) 
      18 LOAD_FAST    1 (opg) 
      21 BINARY_AND   
      22 DUP_TOP    
      23 ROT_THREE   
      24 COMPARE_OP    2 (==) 
      27 JUMP_IF_FALSE_OR_POP 39 
      30 LOAD_CONST    2 (129) 
      33 COMPARE_OP    2 (==) 
      36 JUMP_FORWARD    2 (to 41) 
     >> 39 ROT_TWO    
      40 POP_TOP    
     >> 41 POP_TOP    
      42 LOAD_CONST    0 (None) 
      45 RETURN_VALUE   
>>> dis.dis(func2) 
    2   0 LOAD_CONST    3 ((160, 129)) 
       3 UNPACK_SEQUENCE   2 
       6 STORE_FAST    0 (opc) 
       9 STORE_FAST    1 (opg) 

    3   12 LOAD_FAST    0 (opc) 
      15 LOAD_CONST    1 (160) 
      18 COMPARE_OP    2 (==) 
      21 JUMP_IF_FALSE_OR_POP 33 
      24 LOAD_FAST    1 (opg) 
      27 LOAD_CONST    2 (129) 
      30 COMPARE_OP    2 (==) 
     >> 33 POP_TOP    
      34 LOAD_CONST    0 (None) 
      37 RETURN_VALUE   

Как указано Hoopdady, вы также не раскалываете свою строку правильно. line.split() или line.split(None) будет разделен на последовательные пробелы пробелов.

2

Просто используйте line.split() вместо line.split(" "). Таким образом, он обрабатывает любые типы пробелов. Если это не просто пробелы, вы получите некоторые странные результаты, и это может случиться.

+0

Нет, вызов 'int()' игнорирует лишние пробелы. –

+1

@MartijnPieters - Да, но '' 1 _____ 2 ".split (" ") [1]' даже не дает вам что-то «' int'able »(где' _' представляют пробелы) – mgilson

+0

@mgilson: хорошая точка , но тогда вы получите ValueError. –

Смежные вопросы