Преобразовать список Python со строками все в нижний или верхний регистр
261
У меня есть список переменных Python, который содержит строки. Есть ли функция Python, которая может преобразовать все строки за один проход в нижний регистр и наоборот, в верхний регистр?
Почему "за один проход"? Вы рассматриваете возможность того, что это займет несколько проходов?
Джон Мачин
Каким должен быть выход?
О.Рка
Ответы:
440
Это можно сделать с помощью списочных представлений. Они в основном принимают форму [function-of-item for item in some-list]. Например, чтобы создать новый список, в котором все элементы имеют нижний регистр (или верхний регистр во втором фрагменте), вы должны использовать:
>>>[x.lower()for x in["A","B","C"]]['a','b','c']>>>[x.upper()for x in["a","b","c"]]['A','B','C']
Функция карты работает как положено в python2, однако в python3 вы можете обернуть карту в список, например:list(map(lambda x:x.upper(),["a","b","c"]))
Tom S
39
Второе предложение с картой правильное, но расточительное. Нет смысла делать лямбда-функцию . Просто используйтеmap(str.lower, ["A","B","C"])
fralau
1
Когда я пытаюсь напечатать список после этого звонка, ничего не меняется. Это почему?
имитировать
1
@mimic Немного поздно, но для людей, сталкивающихся с этим, я предполагаю, что ваша проблема, вероятно, заключалась в том, что вы не присваивали результат понимания списка вашему списку. Простое выполнение со списком возвращает значение, но не переназначает его в переменную списка.
Майкл Колбер
52
Помимо легкости чтения (для многих людей), списочные представления также выигрывают в скоростной гонке:
$ python2.6-m timeit '[x.lower() for x in ["A","B","C"]]'1000000 loops, best of 3:1.03 usec per loop
$ python2.6-m timeit '[x.upper() for x in ["a","b","c"]]'1000000 loops, best of 3:1.04 usec per loop
$ python2.6-m timeit 'map(str.lower,["A","B","C"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(str.upper,["a","b","c"])'1000000 loops, best of 3:1.44 usec per loop
$ python2.6-m timeit 'map(lambda x:x.lower(),["A","B","C"])'1000000 loops, best of 3:1.87 usec per loop
$ python2.6-m timeit 'map(lambda x:x.upper(),["a","b","c"])'1000000 loops, best of 3:1.87 usec per loop
Вы знаете причину, почему понимание списка происходит быстрее, чем отображение?
Nixuz
6
Это не всегда быстрее. Вот пример, где это не так: stackoverflow.com/questions/1247486/… Но это не намного медленнее в этом случае. Использование лямбды, очевидно, имеет большое значение. Есть и другие примеры того, почему опасно доверять своей интуиции в вопросах производительности, особенно в Python.
Нед Дейли
3
в питоне 3 mapвыигрывает гонку, но ничего не делает :)
Жан-Франсуа Фабр
@NedDeily map(str.lower,["A","B","C"])самый быстрый - это python3.7.5
очевидно, str.upperчтобы преобразовать в верхний регистр
Джон Ла Рой
20
Понимание списка - это то, как я это делаю, это «Pythonic». Следующая расшифровка показывает, как преобразовать список в верхний регистр, а затем обратно в нижний:
pax@paxbox7:~$ python3
Python3.5.2(default,Nov172016,17:05:23)[GCC 5.4.020160609] on linux
Type"help","copyright","credits"or"license"for more information.>>> x =["one","two","three"]; x
['one','two','three']>>> x =[element.upper()for element in x]; x
['ONE','TWO','THREE']>>> x =[element.lower()for element in x]; x
['one','two','three']
ошибаться, использование listв качестве имени переменной не лучший выбор :)
Жан-Франсуа Фабр
Нет, но, поскольку имя не имеет большого значения для показанного метода, оно не очень актуально. Однако я поменяю имя на тот случай, если кто-то захочет использовать код как есть.
paxdiablo
магия stackoverflow: 250 голосов за решение только для Python 2 с использованием лямбды, где это не должно !! хорошо 249 сейчас
Жан-Франсуа Фабр
@ Жан-Франсуа Фабр, не уверен, почему вы думаете, что это решение только для Python-2. Как видно из стенограммы, он явно работает под Python 3.5.2. На самом деле, я просто проверил это снова для подтверждения. ... проходит некоторое время, пока я занимаюсь расследованием ... На самом деле, неважно, кажется, вы говорили о текущем принятом ответе, а не об этом, так что вы, вероятно, должны комментировать там, а не здесь. Без сомнения, честная ошибка. Приветствия.
paxdiablo
1
да, я не критиковал вашу (кроме listматериала :)). Как вы думаете, откуда у вас недавно появилось ультрафиолетовое излучение? :)
Жан-Франсуа Фабр
7
Для этого образца понимание наиболее быстрое
$ python -m timeit -s 's = ["one", "two", "three"] * 1000' '[x.upper for x in s]'
1000 петель, лучшее из 3: 809 юзек на петлю
$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (str.upper, s)'
1000 циклов, лучшее из 3: 1,12 мсек на цикл
$ python -m timeit -s 's = ["one", "two", "three"] * 1000' 'map (lambda x: x.upper (), s)'
1000 циклов, лучшее из 3: 1,77 мсек на цикл
>>> s =[]>>> p =['This','That','There','is','apple']>>>[s.append(i.lower())ifnot i.islower()else s.append(i)for i in p]>>> s
>>>['this','that','there','is','apple']
Это решение создаст отдельный список, содержащий строчные элементы, независимо от их исходного регистра. Если исходный регистр является верхним, то он list sбудет содержать нижний регистр соответствующего элемента в list p. Если исходный регистр элемента списка уже в нижнем регистре, list pто list sон сохранит регистр элемента и сохранит его в нижнем регистре. Теперь вы можете использовать list sвместо list p.
Если ваша цель - сопоставление с другой строкой путем преобразования за один проход, вы также можете использовать ее str.casefold().
Это полезно, когда у вас есть символы, отличные от ascii, и соответствующие версии ascii (например, maße vs masse). Несмотря на str.lowerто, что str.upperв таких случаях str.casefold()произойдет сбой, произойдет сбой . Это доступно в Python 3, и идея подробно обсуждается с ответом https://stackoverflow.com/a/31599276/4848659 .
>>>str="Hello World";>>>print(str.lower());
hello world
>>>print(str.upper());
HELLO WOLRD
>>>print(str.casefold());
hello world
In[1]: a ='which option is the fastest'In[2]:%%timeit
...:''.join(a).upper()762 ns ±11.4 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[3]:%%timeit
...: map(lambda x:x.upper(), a)209 ns ±5.73 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[4]:%%timeit
...: map(str.upper,[i for i in a])1.18µs ±11.3 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)In[5]:%%timeit
...:[i.upper()for i in a]3.2µs ±64.1 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Если вам нужна строка или список в качестве выходных данных, а не итератор (это для Python3), сравните ''.join(string).upper()параметр с этим:
In[10]:%%timeit
...:[i for i in map(lambda x:x.upper(), a)]4.32µs ±112 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
Ответы:
Это можно сделать с помощью списочных представлений. Они в основном принимают форму
[function-of-item for item in some-list]
. Например, чтобы создать новый список, в котором все элементы имеют нижний регистр (или верхний регистр во втором фрагменте), вы должны использовать:Вы также можете использовать
map
функцию:источник
list(map(lambda x:x.upper(),["a","b","c"]))
map(str.lower, ["A","B","C"])
Помимо легкости чтения (для многих людей), списочные представления также выигрывают в скоростной гонке:
источник
map
выигрывает гонку, но ничего не делает :)map(str.lower,["A","B","C"])
самый быстрый - это python3.7.5источник
str.upper
чтобы преобразовать в верхний регистрПонимание списка - это то, как я это делаю, это «Pythonic». Следующая расшифровка показывает, как преобразовать список в верхний регистр, а затем обратно в нижний:
источник
list
в качестве имени переменной не лучший выбор :)list
материала :)). Как вы думаете, откуда у вас недавно появилось ультрафиолетовое излучение? :)Для этого образца понимание наиболее быстрое
источник
студент спрашивает, другой студент с той же проблемой отвечает :))
источник
источник
Решение:
Это решение создаст отдельный список, содержащий строчные элементы, независимо от их исходного регистра. Если исходный регистр является верхним, то он
list s
будет содержать нижний регистр соответствующего элемента вlist p
. Если исходный регистр элемента списка уже в нижнем регистре,list p
тоlist s
он сохранит регистр элемента и сохранит его в нижнем регистре. Теперь вы можете использоватьlist s
вместоlist p
.источник
Если ваша цель - сопоставление с другой строкой путем преобразования за один проход, вы также можете использовать ее
str.casefold()
.Это полезно, когда у вас есть символы, отличные от ascii, и соответствующие версии ascii (например, maße vs masse). Несмотря на
str.lower
то, чтоstr.upper
в таких случаяхstr.casefold()
произойдет сбой, произойдет сбой . Это доступно в Python 3, и идея подробно обсуждается с ответом https://stackoverflow.com/a/31599276/4848659 .источник
Гораздо более простая версия главного ответа дается здесь @Amorpheuses.
Со списком значений в val:
Это хорошо сработало для меня с источником текста f = open ().
источник
Вы можете попробовать использовать:
источник
Python3.6.8
Если вам нужна строка или список в качестве выходных данных, а не итератор (это для Python3), сравните
''.join(string).upper()
параметр с этим:источник
Если вы пытаетесь преобразовать всю строку в нижний регистр в списке, вы можете использовать pandas:
вывод:
источник