【问题标题】:Python skipping negative valuesPython跳过负值
【发布时间】:2015-12-09 01:00:14
【问题描述】:

所以我有以下代码来查找 3 个给定值的最小数量,其中 abc,xyz,mnl 是包含要比较的值的列表:

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

问题是它在 2 次迭代时打印最小值为 'b' 并在打印之前跳过 3 次迭代。它在每次迭代中继续这样做,其中包含多个负值(-ve)作为'-7589493', '-1419231',我们可以在第一次迭代中看到。

为什么它不能打印每次迭代的最小值

【问题讨论】:

  • 你的意思是and而不是&amp;&amp; 不是逻辑 and - 它是按位操作。
  • 哦,问题出在操作员上
  • @Anjan 是的,尽管选择的方法并不出色。一开始就很复杂

标签: python skip


【解决方案1】:

稍微不同的方法:

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

我从您的示例中留下了qenumerate,即使它没有被使用。

【讨论】:

  • 从原始发布者的代码来看,这些值似乎是字符串,而不是整数
【解决方案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

【讨论】:

    【解决方案3】:

    &amp; 是二进制的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)
    

    【讨论】:

      【解决方案4】:

      这是我的方法:

      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))
      

      这里的关键是combo的计算。在这种方法中,tup 是 3 个字符串的元组,例如 ('5', '2', '8')combo 是这个元组在转换为int 并用标签['a', 'b', 'c'] 压缩后的组合

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-04
        • 1970-01-01
        • 2019-05-12
        • 2020-11-04
        • 2020-11-13
        • 1970-01-01
        • 2020-08-12
        • 2022-07-11
        相关资源
        最近更新 更多