проверка того, что первая буква в списке является капиталом или не зависит от пользовательского ввода python [duplicate]

У меня была такая же проблема. Исправьте его так:

  width: 100%;  padding: 5px;  / * -------------- Теперь удалите из дополнения, добавленного вами --------------- * / margin: -5px;   

Приветствия

112
задан connor 18 March 2014 в 21:11
поделиться

7 ответов

Я думаю, вам нужно написать дополнительный код. Например:

if 'MICHAEL89' in map(lambda name: name.upper(), USERNAMES):
   ...

В этом случае мы формируем новый список со всеми элементами в USERNAMES, преобразованный в верхний регистр, а затем сравниваем с этим новым списком.

Обновить

Как говорит @viraptor , лучше использовать генератор вместо map. См. @Nathon ответ .

6
ответ дан Community 15 August 2018 в 15:47
поделиться
  • 1
    Или вы можете использовать функцию itertools imap. Это намного быстрее, чем генератор, но выполняет ту же цель. – wheaties 2 September 2010 в 15:24

Обычно (по крайней мере, по крайней мере) вы формируете свой объект, чтобы вести себя так, как вы хотите. name in USERNAMES не чувствителен к регистру, поэтому USERNAMES необходимо изменить:

class NameList(object):
    def __init__(self, names):
        self.names = names

    def __contains__(self, name): # implements `in`
        return name.lower() in (n.lower() for n in self.names)

    def add(self, name):
        self.names.append(name)

# now this works
usernames = NameList(USERNAMES)
print someone in usernames

. Самое замечательное в том, что он открывает путь для многих улучшений без необходимости изменять какой-либо код вне класса , Например, вы можете изменить self.names на набор для более быстрого поиска или вычислить (n.lower() for n in self.names) только один раз и сохранить его в классе и т. Д. ...

9
ответ дан Jochen Ritzel 15 August 2018 в 15:47
поделиться

str.casefold рекомендуется для сопоставления строк без учета регистра. Решение @ nmichaels может быть адаптировано тривиально.

Используйте либо:

if 'MICHAEL89'.casefold() in (name.casefold() for name in USERNAMES):

Или:

if 'MICHAEL89'.casefold() in map(str.casefold, USERNAMES):

В соответствии с docs :

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

0
ответ дан jpp 15 August 2018 в 15:47
поделиться
if 'MICHAEL89' in (name.upper() for name in USERNAMES):
    ...

Альтернативно:

if 'MICHAEL89' in map(str.upper, USERNAMES):
    ...

Или, да, вы можете создать собственный метод.

133
ответ дан nmichaels 15 August 2018 в 15:47
поделиться
  • 1
    if 'CaseFudge'.lower() in [x.lower() for x in list] – fredley 2 September 2010 в 15:00
  • 2
    [...] создает весь список. (name.upper() for name in USERNAMES) создаст только генератор и одну нужную строку за раз - огромную экономию памяти, если вы много выполняете эту операцию. (еще больше сбережений, если вы просто создаете список нижестоящих имен пользователей, которые вы повторно используете для проверки каждый раз) – viraptor 2 September 2010 в 15:06
  • 3
    Предпочитаете понижать все ключи при построении dict, по соображениям производительности. – Ryan 1 May 2013 в 07:27
  • 4
    если [x.lower () для x в списке] является пониманием списка, является ли (name.upper () для имени в USERNAMES) понятием кортежа? Или у него есть другое имя? – otocan 19 April 2018 в 08:48
  • 5
    @otocan Это выражение генератора. – nmichaels 19 April 2018 в 13:13

Вот один из способов:

if string1.lower() in string2.lower(): 
    ...
4
ответ дан User 15 August 2018 в 15:47
поделиться

Я бы сделал обертку , чтобы вы не были инвазивны. Минимально, например ...:

class CaseInsensitively(object):
    def __init__(self, s):
        self.__s = s.lower()
    def __hash__(self):
        return hash(self.__s)
    def __eq__(self, other):
        # ensure proper comparison between instances of this class
        try:
           other = other.__s
        except (TypeError, AttributeError):
          try:
             other = other.lower()
          except:
             pass
        return self.__s == other

Теперь if CaseInsensitively('MICHAEL89') in whatever: должен вести себя по мере необходимости (есть ли правая часть - список, dict или set). (Может потребоваться больше усилий для достижения аналогичных результатов для включения строк, во избежание предупреждений в некоторых случаях с участием unicode и т. Д.).

15
ответ дан Venkatesh Bachu 15 August 2018 в 15:47
поделиться
  • 1
    это не работает для dict try, если CaseInsensitively ('MICHAEL89') в {'Michael89': True}: print & quot; found & quot; – Xavier Combelle 2 September 2010 в 15:56
  • 2
    Ксавье: вам понадобится CaseInsensitively('MICHAEL89') in {CaseInsensitively('Michael89'):True} для этого, что, вероятно, не подпадает под «вести себя по мере необходимости». – Gabe 2 September 2010 в 16:07
  • 3
    Настолько, что есть только один очевидный способ сделать это. Это тяжело, если оно не будет использоваться много. Тем не менее, это очень гладко. – nmichaels 2 September 2010 в 18:56
  • 4
    @Nathon, мне кажется, что необходимость инвазивного изменения контейнера является «тяжелой». операция. Полностью неинвазивная обертка: сколько "легче" чем это можно было бы получить ?! Немного;-). @Xavier, RHS, которые являются dicts или наборами со смешанными ключами / элементами, нуждаются в собственных неинвазивных оболочках (часть коротких etc. и «требует больше усилий» частей моего ответа ;-). – Alex Martelli 2 September 2010 в 19:14
  • 5
    Мое определение тяжелой работы заключается в написании довольно небольшого кода, чтобы сделать что-то, что будет использоваться только один раз, когда будет работать менее надежная, но более короткая версия. Если это будет использоваться более одного раза, это совершенно разумно. – nmichaels 2 September 2010 в 19:35

Вы можете сделать

matcher = re.compile('MICHAEL89', re.IGNORECASE)
filter(matcher.match, USERNAMES) 

Обновление: немного поиграть, и я думаю, что вы можете получить лучший подход типа короткого замыкания, используя

matcher = re.compile('MICHAEL89', re.IGNORECASE)
if any( ifilter( matcher.match, USERNAMES ) ):
    #your code here

ifilter функция - из itertools, одного из моих любимых модулей в Python. Это быстрее, чем генератор, но только создает следующий элемент списка при вызове.

4
ответ дан wheaties 15 August 2018 в 15:47
поделиться
  • 1
    Просто чтобы добавить, шаблон, возможно, потребуется экранировать, поскольку он может содержать символы типа & quot;. & Quot; & quot; & quot ;, & quot ;, который имеет специальное значение в шаблонах регулярных выражений. используйте re.escape (raw_string), чтобы сделать это – Iching Chang 9 January 2017 в 00:29
Другие вопросы по тегам:

Похожие вопросы: