Python - Как сделать пользовательский ввод не чувствительным к регистру? - PullRequest
0 голосов
/ 05 мая 2018

Я новичок в Python и мог бы действительно помочь с этим. Я хочу создать функцию для фильтрации, какие файлы я хочу открыть и какие конкретно месяцы и день. Таким образом, пользователи должны указать, какой город (файлы) они хотят проанализировать в конкретный месяц или день. Однако я хочу, чтобы пользователь мог вводить то, что не чувствительно к регистру. Например, пользователь может ввести 'chicago' / 'CHICAGO "/" ChIcAgO ", и он все равно даст вам правильный вывод, а не сообщение об обработке ошибок. Вот код, который я использую:

def get_filters ():

    city_options = ['Chicago','New York City','Washington']
    month_options = ['January','February','March','April','May','June','All']
    day_options = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday','All']
    while True:
        try:
            city = city_options.index(input('\nInsert name of the city to analyze! (Chicago, New York City, Washington)\n'))
            month = month_options.index(input('\nInsert month to filter by or "All" to apply no month filter! (January, February, etc.)\n'))
            day = day_options.index(input('\nInsert day of the week to filter by or "All" to apply no day filter! (Monday, Tuesday, etc.)\n'))
            return city_options[city].lower(), month_options[month].lower(), day_options[day].lower()
        except ValueError:
            print ("Your previous choice is not available. Please try again")

def load_data (city,month,day):

    #load data file into DataFrame
    df = pd.read_csv(CITY_DATA[city].lower())

    #convert start time column (string) to datetime
    df['Start Time']=pd.to_datetime(df['Start Time'])

    #create new column to extract month and day of the week from start time
    df['Month'] = df['Start Time'].dt.month
    df['Day_of_Week'] = df['Start Time'].dt.weekday_name

    #filter by month if applicable
    if month.lower()!= 'All':
        #use the index of the month list to get corresponding into
        months = ['January', 'February', 'March', 'April', 'May', 'June']
        month = months.index(month) + 1
        #filter by month to create new dataframes
        df = df[df['Month'] == month]

    if day.lower()!= 'All':
        #filter by day_of_week to create new DataFrames
        df =df[df['Day_of_Week'] == day]

    return(df)

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Я тоже новичок, но думаю, вам стоит взглянуть на строковые функции. Предполагая, что вы используете Python 3, поскольку вы используете input и не получаете ValueError, вы можете просто добавить .lover (). Title () после круглых скобок ввода

Пример:

city = city_options.index(input('\nInsert name of the city to analyze! (Chicago, New York City, Washington)\n').lower().title())

Должно быть так же, как если бы вы вводили cHIcaGO, он мгновенно преобразуется в Чикаго.

Надеюсь, это поможет!

Редактировать: (После исправления орфографических ошибок в функции lower () пробовал на веб-браузере, pycharm и самом Python. У меня это прекрасно работает (я использую python 2.7, поэтому я исправил все входные данные как raw_input, если вы используете python 3) вам не нужно их менять.).)

0 голосов
/ 05 мая 2018

Вы должны использовать str.casefold для удаления чувствительности к регистру. Согласно документам , это более строго, чем str.lower:

str.casefold ()

Возвращает свернутую в регистр копию строки. Могут быть использованы строки в кейсе для сопоставления без учета регистра.

Casefolding похож на нижний регистр, но более агрессивен, потому что предназначен для удаления всех различий в строке. Например, немецкая строчная буква «ß» эквивалентна «ss». Так как это уже нижний регистр, lower () ничего бы не сделал для 'ß'; casefold () преобразует его в "ss".

Например:

x = 'ßHello'

print(x.casefold())

sshello
0 голосов
/ 05 мая 2018

Лучший способ сделать это - просто взять необходимые данные и преобразовать их в нужный случай.

Используйте встроенные функции python

variable.lower()

или

variable.upper()
...