按第二个元素对列表进行排序

时间:2019-04-10 16:05:41

标签: python python-3.x sorting

我正在尝试对由名称和数字组成的列表进行排序,在这种情况下,是人名和保龄球得分。我想按字母顺序和数字顺序对列表进行排序。我很难弄清楚如何对列表进行数字排序。列表如下所示:['','Ann,40','Jeff,250','Zane,20']。无论如何,我可以对列表中的第二个元素而不是第一个使用内置的排序功能吗?

const prizes = { tshirts: [ 
        { "tshirtName":"Green Shirt", "qty": 1,}, 
        { "tshirtName":"Blue Shirt", "qty": 2, }, 
        { "tshirtName":"Red Shirt", "qty": 7, }, 
        { "tshirtName":"Yellow Shirt", "qty": 22, } 
        ]}; 
 
 let Data = []; 
 
 prizes.tshirts.map(tshirt => { 
          let i = 0; 
          while( i < tshirt.qty){
               Data.push(tshirt.tshirtName); i++; }; 
          }); 
let randomChoice = Math.floor(Math.random()*Data.length);        
console.log(Data[randomChoice]);

最终目标是展示

#Here is the code
l=['Ann, 40', 'Jeff, 250', 'Zane, 20']


l.sort(l[1])
for i in l:
    print(i)
#l.sort(l[1]) does not work

4 个答案:

答案 0 :(得分:4)

您可以使用按键功能以相反的顺序排序,该功能将每个输入字符串除以,,并在将第二个项目转换为整数后返回第二个项目:

l.sort(key=lambda s: int(s.split(', ')[1]), reverse=True)

l变为:

['Jeff, 250', 'Ann, 40', 'Zane, 20']

答案 1 :(得分:0)

拆分列表并将其转换为列表后,对第二个元素进行排序

l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
l.sort(key = lambda x: int(x.split()[1]), reverse=True)
for item in l:
    print(item)
#Jeff, 250
#Ann, 40
#Zane, 20

答案 2 :(得分:0)

此方法提供您请求的输出。

l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
l.sort(key = lambda x: int(x.split()[1]), reverse=True)
print(*l, sep = '\n')
# outputs
Jeff, 250
Ann, 40
Zane, 20

此方法短了一行,但执行相同的工作。

l=['Ann, 40', 'Jeff, 250', 'Zane, 20']
print(*sorted(l, key = lambda x: int(x.split()[1]), reverse=True),sep = "\n")
# outputs
Jeff, 250
Ann, 40
Zane, 20

这里是reference,与我在print语句中使用*一样。

答案 3 :(得分:0)

对于我来说,更干净的方法是:

首先创建一个类来处理您的对象,然后实现排序所需的方法, gt lt

@dataclass
class Person:

    name: str
    value: int

    @classmethod
    def create_from_str(cls, string):
        name, value = string.split(", ")
        return cls(name, int(value))

    def __gt__(self, other):
        return self.value > other.value

    def __lt__(self, other):
        return self.value < other.value

    def __repr__(self):
        return f"{self.name}, {self.value}"


l = ['Ann, 40', 'Jeff, 250', 'Zane, 20']

persons = [Person.create_from_str(string) for string in l]

persons.sort(reverse=True)

print("\n".join(map(str, persons)))

# Jeff, 250
# Ann, 40
# Zane, 20