繁体   English   中英

向后打印元组

[英]Printing a tuple backwards

我正在研究一段Python代码,其中包括允许用户为3种不同的汽车输入最高速度,然后打印出汽车的名称和最高速度按升序排序。

到目前为止,已经创建了两个列表

carName= ["Ferrari", "Lambo", "Porsche"]

carSpeed= ["245.5794", "242.4616", "318.1555"]

carSpeed已经四舍五入到小数点后两位

carSpeedTwoDP= ['%.2f' % elem for elem in carSpeed]

该列表与carName一起被制作成元组

carSpeedSorted= sorted(zip(carSpeed, carName))

然后我打印出元组

for i in range (3):
    print "%s"% (carSpeedSorted[i],)

然而,这提出了一个问题。 该表应该显示

Lambo 242.46
Ferrari 245.58
Porsche 318.16

但是因为速度是元组中的第一个(因为列表必须按升序速度排序,而元组使用它们可以找到的第一个元素对它们进行排序),显示如下:

('242.46', 'Lambo')
('245.58', 'Ferrari')
('318.16', 'Porsche ')

我已经研究了一段时间,但是还没有能够提出一个解决方案来反转列表,以便首先显示汽车名称,同时保持元组按速度排序。

任何帮助将不胜感激! 谢谢!

您可以简单地将汽车名称放在第一位,并使用每个元组的第二个元素作为关键字进行排序:

from operator import itemgetter
carSpeedSorted = sorted(zip(carName, carSpeed), key=itemgetter(1))

现在:

for a in carSpeedSorted:
    print '%s' % (a,) 
('Lambo', '242.4616')
('Ferrari', '245.5794')
('Porsche', '318.1555')

参考文献:

反转切片操作符发生了什么变化?

print (0, 1, 2)[::-1]
# Outputs '(2, 1, 0)'

这被称为“反向切片”。 它是最小的,但它适用于任何几乎是序列的东西,或者包含多个项目,例如tuplelist 您可以在此处阅读有关逆转的更多信息。

您的问题有两种解决方案。

1.修复打印

有办法做到这一点:

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.修复排序

您可以拥有(name, speed)元组并仍按速度排序,例如:

sorted(name_speed_tuples, key=lambda name_speed: name_speed[1])

顺便说一下,你确定要按字母顺序排序吗?

在您的代码中,速度'1000.00'将在'200.00'之前出现!

我建议使用round来舍入数字,而不是创建一个字符串。 那样可以解决问题。

carSpeedTwoDP= [round(elem,2) for elem in carSpeed]

实际上你可以很容易地按元组的第二个元素排序:

sorted(zip(carName, carSpeed), key=lambda x: (x[1], x[0]))

上面的方法按照它们的速度的升序对元组列表进行排序,并且在绘制的情况下,名字较小的元组首先出现。

为什么不按要求的顺序打印?

print( "%s %s" %(carSpeedSorted[i][1],carSpeedSorted[i][0]))

OUTPUT

Lambo 242.4616
Ferrari 245.5794
Porsche 318.1555

其他人正确地指出你可以在不首先反转项目的情况下进行排序,但如果你想在tuple处于“错误”顺序时进行打印,那就不难了,只需反转tuple (并使格式字符串同时打印)部分):

# 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM