我正在尝试对由名称和数字组成的列表进行排序,在这种情况下,是人名和保龄球得分。我想按字母顺序和数字顺序对列表进行排序。我很难弄清楚如何对列表进行数字排序。列表如下所示:['','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
答案 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