关于python:向后打印元组

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

您可以使用(name, speed)元组,并且仍然按速度排序,例如:

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

顺便问一下,您确定要按速度字母排序吗?

在您的代码中,速度"1000.00"将在"200.00"之前!

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

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

反转切片运算符发生了什么?

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

这被称为"反向切片"。它是最小的,但是它可以在几乎是一个序列的任何东西中工作,或者包含一个项目的倍数,比如tuplelist。您可以在这里阅读更多关于反转的内容。


您只需将汽车名称放在第一位,并使用每个元组的第二个元素作为键进行排序:

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
  • 小精灵


    其他人正确地指出,您可以在不颠倒项目的情况下进行排序,但如果您想在tuple处于"错误"顺序时进行打印,这并不难,只需反转tuple即可(并使格式字符串同时打印两部分):

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

    上面的方法按照元组速度的升序对其列表进行排序,如果是绘制,则以较小名称的列表为第一。