2015-09-12 4 views
0

Поэтому у меня есть следующий код, чтобы найти мин число 3 заданных значений, где abc,xyz,mnl являются список, содержащие значения для сравнения, как:Python пропуск отрицательных значений

for q , (a,b,c) in enumerate(zip(abc,xyz,mnl)): 
    print (a,b,c) 
    if int(a) < int(b) & int(a) < int(c): 
     print "a","\t",a 
    elif int(b) < int(a) & int(b) < int(c): 
     print "b","\t",b 
    elif int(c) < int(a) & int(c) < int(b): 
     print "c","\t",c 

И я получаю этот выход

('3137775', '-7589493', '-1419231') 
('6199235', '-3810275', '-8726482') 
('2649229', '-4119818', '3726604') 
b -4119818 
('-1960710', '2758796', '9426184') 
a -1960710 

Проблема заключается в том, что он печатает значение min, которое является «b» на 2 итерации, и пропускает 3 итерации перед этой печатью. И он продолжает делать это на каждой итерации, которая содержит более одного значения в отрицательном (-ve) как '-7589493', '-1419231', который мы можем увидеть на первой итерации.

Почему он не может напечатать значение мин для каждой итерации

+1

Вы имеете в виду 'и', а не' & '; '&' не является логическим 'и' - это побитовая операция. –

+0

О, так что проблема была неправильной оператором – Anjan

+0

@Anjan да, хотя выбранный метод не блестящий. Это довольно сложно для начала – Tim

ответ

-1

& это двоичный AND, не логично AND.

Попробуйте это:

for q, (a, b, c) in enumerate(zip(abc, xyz, mnl)): 
    print(a, b, c) 
    if int(c) > int(a) < int(b): 
     print("a", "\t", a) 
    elif int(c) > int(b) < int(a): 
     print("b", "\t", b) 
    elif int(b) > int(c) < int(a): 
     print("c", "\t", c) 

или с помощью AND логического оператора:

for q, (a, b, c) in enumerate(zip(abc, xyz, mnl)): 
    print(a, b, c) 
    if int(a) < int(b) and int(a) < int(c): 
     print("a", "\t", a) 
    elif int(b) < int(a) and int(b) < int(c): 
     print("b", "\t", b) 
    elif int(c) < int(a) and int(c) < int(b): 
     print("c", "\t", c) 
2

несколько иной подход:

abc = ('1', '2', '3') 
xyz = ('3', '1', '2') 
mnl = ('2', '3', '1') 

for q , (a,b,c) in enumerate(zip(abc,xyz,mnl)): 
    (aa, bb, cc) = (int(a), int(b), int(c)) 
    print(aa, bb, cc) 
    m = min(aa, bb, cc) 
    index = (aa, bb, cc).index(m) 
    print 'abc'[index], m 

# output: 
(1, 3, 2) 
a 1 
(2, 1, 3) 
b 1 
(3, 2, 1) 
c 1 

я оставил q и enumerate из вашего примера, даже если он не используется.

+0

Из исходного кода плаката, кажется, значения строки, а не ints –

+0

Вы правы. обновлено. –

2

As hiro says, вы можете использовать функцию min. Но, если вы бы скорее, это должно работать:

abc = (1,2,3) 
xyz = (2,3,1) 
mnl = (3,1,2) 

for q , (a,b,c) in enumerate(zip(abc,xyz,mnl)): 
    print (a,b,c) 
    a,b,c=int(a),int(b),int(c) 
    if b > a < c: 
     print ("a",a) 
    elif a > b < c: 
     print ("b",b) 
    elif b > c < a: 
     print ("c",c) 

Выход:

(1, 2, 3) 
a 1 
(2, 3, 1) 
c 1 
(3, 1, 2) 
b 1 
0

Вот мой подход:

for q, tup in enumerate(zip(abc, xyz, mnl)): 
    combo = ((int(x), y) for x, y in zip(tup, 'abc')) 
    # example of combo: ((5, 'a'), (2, 'b'), (8, 'c')) 
    print '{1}\t{0}'.format(*min(combo)) 

Ключевым моментом здесь является расчет комбо. В этом подходе tup является кортежем из 3 строк, таких как ('5', '2', '8'). combo представляет собой комбинацию этого кортежа после преобразования в int и наклейки с этикетками ['a', 'b', 'c']