Printing a tuple backwards
我正在编写一段python代码,它允许用户输入3辆不同汽车的最高速度,然后按升序打印出汽车的名称和最高速度。
到目前为止,已经创建了两个列表
1 | carName= ["Ferrari","Lambo","Porsche"] |
和
1 | carSpeed= ["245.5794","242.4616","318.1555"] |
号
车速已四舍五入到小数点后2位
1 | carSpeedTwoDP= ['%.2f' % elem for elem in carSpeed] |
那张单子,连同卡纳姆,已经做成了一个三元组
1 | carSpeedSorted= sorted(zip(carSpeed, carName)) |
。
然后我用
1 2 | for i in range (3): print"%s"% (carSpeedSorted[i],) |
然而,这带来了一个问题。这张桌子应该是用来展示的
1 2 3 | Lambo 242.46 Ferrari 245.58 Porsche 318.16 |
。
但是,由于速度是元组中的第一个(因为列表必须按升序排序,而元组本身使用它们能找到的第一个元素排序),所以显示如下:
1 2 3 | ('242.46', 'Lambo') ('245.58', 'Ferrari') ('318.16', 'Porsche ') |
。
我已经研究了一段时间了,但还没能想出一个方法来颠倒列表,使汽车名称首先出现,同时保持按速度排序的元组。
任何帮助都将不胜感激!谢谢您!
你的问题有两种解决办法。
1。固定打印有很多方法可以做到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | carSpeedSorted[i] = ('242.46', 'Lambo') print"{1} {0}".format(*carSpeedSorted[i]) # or: print"%s %s" % (carSpeedSorted[i][1], carSpeedSorted[i][0]) # or: speed, name = carSpeedSorted[i] print"%s %s" % (name, speed) # or: print"%(name)s %(speed)s" % dict(speed=carSpeedSorted[i][0], name=carSpeedSorted[i][1]) |
2。修复排序
您可以使用
1 | sorted(name_speed_tuples, key=lambda name_speed: name_speed[1]) |
。
顺便问一下,您确定要按速度字母排序吗?
在您的代码中,速度"1000.00"将在"200.00"之前!
我建议使用
1 | carSpeedTwoDP= [round(elem,2) for elem in carSpeed] |
反转切片运算符发生了什么?
1 2 | print (0, 1, 2)[::-1] # Outputs '(2, 1, 0)' |
。
这被称为"反向切片"。它是最小的,但是它可以在几乎是一个序列的任何东西中工作,或者包含一个项目的倍数,比如
您只需将汽车名称放在第一位,并使用每个元组的第二个元素作为键进行排序:
1 2 | from operator import itemgetter carSpeedSorted = sorted(zip(carName, carSpeed), key=itemgetter(1)) |
现在:
1 2 | for a in carSpeedSorted: print '%s' % (a,) |
号
1 2 3 | ('Lambo', '242.4616') ('Ferrari', '245.5794') ('Porsche', '318.1555') |
参考文献:
operator.itemgetter 。
小精灵
其他人正确地指出,您可以在不颠倒项目的情况下进行排序,但如果您想在
1 2 3 4 5 | # Iterate list directly; indexing on range is a C habit you should get out of for carspeed in carSpeedSorted: # Reverse the tuple and use it directly; wrapping in a single element # tuple adds the parens and commas your desired output didn't want print"%s %s" % carspeed[::-1] |
。
为什么不按要求的顺序打印呢?
1 | print("%s %s" %(carSpeedSorted[i][1],carSpeedSorted[i][0])) |
产量
1 2 3 | Lambo 242.4616 Ferrari 245.5794 Porsche 318.1555 |
。
实际上,您可以很容易地按元组的第二个元素排序:
1 | sorted(zip(carName, carSpeed), key=lambda x: (x[1], x[0])) |
。
上面的方法按照元组速度的升序对其列表进行排序,如果是绘制,则以较小名称的列表为第一。