我需要按字母顺序对列表进行排序,但忽略字母的大小写。
my_list = [('CAT', 1), ('Crop', 1), ('PoP', 4), ('anTs', 1), ('apple', 1), ('cAt', 1), ('can', 1), ('dog', 1), ('long', 1), ('poeT', 1), ('toe', 2)]
我想收到:
my_list_sorted = [('anTs', 1), ('apple', 1), ('can', 1), ('CAT', 1), ('cAt', 1), ('Crop', 1), ('dog', 1), ('long', 1), ('poeT', 1), ('PoP', 4), ('toe', 2)]
我试图做:
sorted(set(my_list),key=str.lower())
但是我收到此错误:
TypeError: descriptor 'lower' of 'str' object needs an argument
有人可以帮我吗?
谢谢你, 杰森
答案 0 :(得分:8)
这应该有效:
sorted(my_list, key=lambda x: x[0].casefold())
函数key
的{{1}}参数是在排序过程中用于比较的值。在这种情况下,我们想要的sorted
是小写的元组的字符串部分,因此这就是我们使用单行lambda函数返回的结果。
在python key
中,它是一个基本的内置函数,可将传递的值转换为字符串,这就是错误的原因。
请参见str.casefold()
,以了解为什么比str
更受青睐
答案 1 :(得分:2)
如果您不需要保留列表的原始版本,则可以通过调用list方法更快地将其排序:
import React, { PureComponent } from "react";
import { Formik } from "formik";
import RenderBookingForm from "./RenderBookingForm";
import { dateFormat, timeFormat } from "./FieldFormats";
import moment from "moment";
const initialValues = {
bookingClient: "",
bookingDate: moment(Date.now()),
bookingTime: moment(Date.now()),
selectOptions: ["Mark", "Bob", "Anthony"]
};
const handleSubmit = formProps => {
const { bookingClient, bookingDate, bookingTime, email } = formProps;
const selectedDate = moment(bookingDate).format(dateFormat);
const selectedTime = moment(bookingTime).format(timeFormat);
alert(
`Email: ${email} \nSelected Date: ${selectedDate} \nSelected Time: ${selectedTime}\nSelected Client: ${bookingClient}`
);
};
export default () => (
<Formik
initialValues={initialValues}
onSubmit={handleSubmit}
render={RenderBookingForm}
/>
);
此方法不会返回任何内容,因为原始列表对象现在已排序。
答案 2 :(得分:0)
您需要提供一个关键功能:
sorted(my_list, key=lambda item : item[0].lower())