我需要能够按升序或降序对员工姓名及其年龄的并行列表进行排序。我可以得到一个列表进行排序,但我不知道如何获得第二个列表将名称与他们的年龄单独配对。例如,我需要它看起来像这样。
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()
答案 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)
这里最大的问题是你有并行列表。保存数据的更好方法是单个“记录”列表,其中包含有关单个员工的所有信息。根据您需要的结构数量,您可以使用dict
,tuple
,namedtuple
或自定义类来记录。以下是自定义类的示例:
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