Python 3.6-排序的元组集

时间:2018-11-18 00:33:05

标签: python sorting

我需要按字母顺序对列表进行排序,但忽略字母的大小写。

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

有人可以帮我吗?

谢谢你, 杰森

3 个答案:

答案 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())