Преобразовать список 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']

Вы также можете использовать mapфункцию:

>>> map(lambda x:x.lower(),["A","B","C"])
['a', 'b', 'c']
>>> map(lambda x:x.upper(),["a","b","c"])
['A', 'B', 'C']

12
Функция карты работает как положено в 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

4
Вы знаете причину, почему понимание списка происходит быстрее, чем отображение?
Nixuz

6
Это не всегда быстрее. Вот пример, где это не так: stackoverflow.com/questions/1247486/… Но это не намного медленнее в этом случае. Использование лямбды, очевидно, имеет большое значение. Есть и другие примеры того, почему опасно доверять своей интуиции в вопросах производительности, особенно в Python.
Нед Дейли

3
в питоне 3 mapвыигрывает гонку, но ничего не делает :)
Жан-Франсуа Фабр

@NedDeily map(str.lower,["A","B","C"])самый быстрый - это python3.7.5
ШИВАМ ДЖИНДАЛ


20

Понимание списка - это то, как я это делаю, это «Pythonic». Следующая расшифровка показывает, как преобразовать список в верхний регистр, а затем обратно в нижний:

pax@paxbox7:~$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 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']

2
ошибаться, использование 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 мсек на цикл

5

студент спрашивает, другой студент с той же проблемой отвечает :))

fruits=['orange', 'grape', 'kiwi', 'apple', 'mango', 'fig', 'lemon']
newList = []
for fruit in fruits:
    newList.append(fruit.upper())
print(newList)

3
mylist = ['Mixed Case One', 'Mixed Case Two', 'Mixed Three']
print(list(map(lambda x: x.lower(), mylist)))
print(list(map(lambda x: x.upper(), mylist)))

2

Решение:

>>> s = []
>>> p = ['This', 'That', 'There', 'is', 'apple']
>>> [s.append(i.lower()) if not 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.


1

Если ваша цель - сопоставление с другой строкой путем преобразования за один проход, вы также можете использовать ее 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

1

Гораздо более простая версия главного ответа дается здесь @Amorpheuses.

Со списком значений в val:

valsLower = [item.lower() for item in vals]

Это хорошо сработало для меня с источником текста f = open ().


1

Вы можете попробовать использовать:

my_list = ['india', 'america', 'china', 'korea']

def capitalize_list(item):
    return item.upper()

print(list(map(capitalize_list, my_list)))

0

Python3.6.8

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)

0

Если вы пытаетесь преобразовать всю строку в нижний регистр в списке, вы можете использовать pandas:

import pandas as pd

data = ['Study', 'Insights']

pd_d = list(pd.Series(data).str.lower())

вывод:

['study', 'insights']
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.