Python 3:如何对两个并行列表进行排序?

时间:2015-10-26 16:52:59

标签: python sorting

我需要能够按升序或降序对员工姓名及其年龄的并行列表进行排序。我可以得到一个列表进行排序,但我不知道如何获得第二个列表将名称与他们的年龄单独配对。例如,我需要它看起来像这样。

Phil is 20 years old
Mike is 23 years old
Jenny is 38 years old
Jim is 65 years old

但它看起来像这样。

['Jim', 'Jenny', 'Phil', 'Mike'] is [20, 23, 38, 66] years old.

到目前为止,这是我的代码。

def get_name():
    employee_name = input("Enter the employee's name: ")
    return employee_name

def get_age():
    while True:
        try:
            employee_age = int(input("Enter the employee's age: "))
            return employee_age
        except ValueError:
            print("Please enter a valid number")

def main():
    num_age = []
    string_name = []

    print("This program sorts employee's by age.")

    while True:
        try:
            num_employees = int(input("Enter the number of employee's who are being evaluated: "))
            break
        except ValueError:
            print("Please enter a valid number.")

    while True:
        for i in range(num_employees):
            num_employees -= 1
            name = get_name()
            string_name += [name]

            age = get_age()
            num_age += [age]

        if num_employees == 0:
            print(str(sorted(string_name)) + " is " + (str(sorted(num_age))) + " years old.")
            break

main()

5 个答案:

答案 0 :(得分:3)

解决此问题的一种经典方法是使用Python的内置zip函数将列表连接在一起,然后对数据进行排序。排序完成后,您可以返回原始(但已排序)列表:

list1 = ['Jim', 'Jenny', 'Phil', 'Mike']
list2 = [65, 38, 20, 23]
list2, list1 = (list(t) for t in zip(*sorted(zip(list2, list1))))

答案 1 :(得分:2)

这里最大的问题是你有并行列表。保存数据的更好方法是单个“记录”列表,其中包含有关单个员工的所有信息。根据您需要的结构数量,您可以使用dicttuplenamedtuple或自定义类来记录。以下是自定义类的示例:

class Employee(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

现在您可以像以前一样填充您的员工:

employees = []
for _ in range(num_employees):
    employees.append(Employee(get_name(), get_age())

现在你可以对任何你想要的东西进行排序。 e.g:

import operator
sorted(employees, key=operator.attrgetter('age'))

答案 2 :(得分:2)

尝试将两个列表压缩在一起以创建元组列表。然后你可以这样做:

sorted([('Jenny', 38),('Jim', 65),('Phil', 20), ('Mike',23)],key=lambda x: x[1])

答案 3 :(得分:2)

设置列表的一个班轮:

temp = sorted(zip(a,b), key=lambda i: i[1], reverse=True)

格式:

for name, age in temp:
    print(name + " is " + age + " years old")

假设

a = ['Jim', 'Jenny', 'Phil', 'Mike']
b = [20, 23, 38, 66]

您也可以更改reverse = False,或将其删除。

答案 4 :(得分:0)

more_itertools有一个优雅的解决方案,可以并行排序多个迭代。

from more_itertools import sort_together

a = ['Jim', 'Jenny', 'Phil', 'Mike']
b = [65, 38, 20, 23]

sort_together([a, b], key_list=[1])
# [('Phil', 'Mike', 'Jenny', 'Jim'), (20, 23, 38, 65)]

我们选择了第二个列表作为密钥。要打印所需的结果:

for name, age in zip(*sort_together([a, b], key_list=[1])):
    print("{} is {} years old".format(name, age))

# Phil is 20 years old
# Mike is 23 years old
# Jenny is 38 years old
# Jim is 65 years old