Как удалить n из элемента списка?
Я пытаюсь получить Python для чтения строки из a .txt файл и записать элементы первой строки в список. Элементы в файле были разделены табуляцией, поэтому я использовал split("t") для разделения элементов. Потому что .файл txt имеет много элементов я сохранил данные в каждой строке в отдельный список.
проблема у меня в настоящее время заключается в том, что он показывает каждый список следующим образом:
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3n']
как я могу удалить n из последнего элемента списка и сделать это просто '7.3'?
14 ответов:
если вы хотите удалить
\nтолько из последнего элемента, используйте это:t[-1] = t[-1].strip()если вы хотите удалить
\nиз всех элементов, используйте этот:t = map(lambda s: s.strip(), t)вы также можете рассмотреть возможность удаления
\nдо разделить строку:line = line.strip() # split line...
начиная с Python3
mapбольше не возвращает alistно amapObject, таким образом ответ будет выглядеть примерно так>>> map(lambda x:x.strip(),l) <map object at 0x7f00b1839fd0>вы можете прочитать больше об этом на что нового в Python 3.0.
map()иfilter()возвращают итераторы. Если вам действительно нужноlist, быстрое исправление, напримерlist(map(...))Итак, каковы способы получения корыто это?
Случай 1-The
listзвонок черезmapСlambda
mapвозвращает итератор.list- это функция, которая может преобразовать итератор на список. Следовательно, вам нужно будет обернутьlistвокругmap. Так что ответ теперь становится,>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> list(map(lambda x:x.strip(),l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']очень хорошо, мы получаем выход. Теперь мы проверяем количество времени, которое требуется для этого часть кода для выполнения.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))" 100000 loops, best of 3: 2.22 usec per loop2.22 микросекунд. Это не так уж и плохо. Но есть ли более эффективные способы?
Случай 2-The
listзвонок черезmapбезlambda
lambdaне одобряется многими в сообществе Python (включая Гвидо). Кроме того, это значительно снизит скорость работы программы. Следовательно, мы должны избегать этого как можно больше. Начальный функцияstr.strip. Приходит к нам на помощь здесь.The
mapможно переписать без использованияlambdaиспользуяstr.stripкак>>> list(map(str.strip,l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']а теперь о времени.
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))" 1000000 loops, best of 3: 1.38 usec per loopфантастика. Вы можете увидеть разницу в эффективности между этими двумя способами. Это почти на 60% быстрее. Таким образом, подход без использования
lambda- это лучший выбор здесь.
Случай 3-Следующие Рекомендации, Обычный путь
еще один важный момент из что нового в Python 3.0 это то, что он советует нам избегать
mapтам, где это возможно.особенно сложно
map()вызвано для побочных эффектов функция; правильное преобразование заключается в использовании регулярногоforпетли (так как создание списка было бы просто расточительно).Итак, мы можем решить эту проблему без
mapС помощью регулярногоforпетли.тривиальный способ решения (грубая сила) будет: -
>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> final_list = [] >>> for i in l: ... final_list.append(i.strip()) ... >>> final_list ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']настройка времени
def f(): l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] final_list = [] for i in l: final_list.append(i.strip()) import timeit print(min(timeit.repeat("f()","from __main__ import f")))и результат.
1.5322505849981098как вы можете видеть, грубая сила здесь немного медленнее. Но он определенно более читаем для обычного программиста, чем
mapпредложения.
Случай 4-Список Постижений
A список понимание здесь также возможно и то же самое, что и в Python2.
>>> [i.strip() for i in l] ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']теперь для таймингов:
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]" 1000000 loops, best of 3: 1.28 usec per loopкак вы можете видеть список-понимание более эффективно, чем
map(даже безlambda). следовательно, правило большого пальца в Python3 заключается в использовании понимания списка вместоmap
механизм случая 5-In-Place и эффективность космоса (Т-М-Т)
последний способ - внести изменения в самом списке. Это позволит сэкономить много места в памяти. Это можно сделать с помощью
enumerate.>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> for i,s in enumerate(l): ... l[i] = s.strip() ... >>> l ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']результат синхронизации будет
1.4806894720022683. Но однако этот путь космос эффективный.
вывод
сравнительный список таймингов (как Python 3.4.3, так и Python 3.5.0)
---------------------------------------------------- |Case| method | Py3.4 |Place| Py3.5 |Place| |----|-----------------|-------|-----|-------|-----| | 1 | map with lambda | 2.22u | 5 | 2.85u | 5 | | 2 | map w/o lambda | 1.38u | 2 | 2.00u | 2 | | 3 | brute-force | 1.53u | 4 | 2.22u | 4 | | 4 | list comp | 1.28u | 1 | 1.25u | 1 | | 5 | in-place | 1.48u | 3 | 2.14u | 3 | ----------------------------------------------------наконец, обратите внимание, что список-понимание-это лучший способ и
mapиспользуяlambda- это самое худшее. Но опять же - - -ТОЛЬКО В PYTHON3
используя список осмысления:
myList = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] [(el.strip()) for el in myList]
от этого ссылке:
вы можете использовать rstrip() метод. Пример
mystring = "hello\n" print(mystring.rstrip('\n'))
в качестве альтернативного метода, если вы знаете, что в ваших данных нет пробелов, что кажется так, вы можете использовать split() (без аргументов). Это разбивает на пустое пространство и использует более эффективный алгоритм, чем другая версия split. Он также удаляет пробелы с обоих концов.
line = line.split()и это все.
вы могли бы сделать -
DELIMITER = '\t' lines = list() for line in open('file.txt'): lines.append(line.strip().split(DELIMITER))The
linesполучил все содержимое файла.можно также использовать список понимания, чтобы сделать это более компактным.
lines = [ line.strip().split(DELIMITER) for line in open('file.txt')]
str.strip () удаляет пробелы. вы также можете передать пользовательские символы в качестве аргумента для раздевания. Элемент прокладки функция удаляет пробелы / пользовательские символы на обоих концах строки. lstrip() и rstrip () - это функции левой полосы и правой полосы соответственно.
например:
test_str = "Vishaka\n" test_str = test_str.strip()test_str теперь Вишака
вы получаете доступ к последнему элементу набора и затем сохранить значение в переменной.
так что у вас есть:
fileName = '7.3\n'потом просто сделать:
fileName.strip()С
7.3. Затем сохранить это значение в последний элемент набора.можно использовать
lstrip()илиrstrip()снять только левую или правую сторону.
это работает, чтобы вывезти
\n(новая строка) от элемента в списке он просто берет первый элемент в строку сdef remove_end(s): templist=[] for i in s: templist.append(i) return(templist[0])
У меня была эта проблема, и я решил ее с помощью функции chomp, описанной выше:
def chomp(s): return s[:-1] if s.endswith('\n') else s def trim_newlines(slist): for i in range(len(slist)): slist[i] = chomp(slist[i]) return slist ..... names = theFile.readlines() names = trim_newlines(names) ....
для обработки многих разделителей новой строки, включая комбинации символов, такие как
\r\nиспользуйте splitlines. Комбайн вступить и splitlines чтобы удалить / заменить все новые строки из строкиs:''.join(s.splitlines())удалить ровно трейлинг новая строка, пас
Trueкакkeependsаргумент для сохранения разделителей, удаляя только разделители в последней строке:def chomp(s): if len(s): lines = s.splitlines(True) last = lines.pop() return ''.join(lines + last.splitlines()) else: return ''
поскольку вопрос OP заключается в том, чтобы удалить символ новой строки из последнего элемента, я бы сбросил его с помощью
the_list[-1].rstrip():>>> the_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> the_list[-1] = ls[-1].rstrip() >>> the_list ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']Это O(1).