Мне было интересно, как проще всего преобразовать string
список вроде следующего в list
:
x = u'[ "A","B","C" , " D"]'
Даже если пользователь ставит пробелы между запятыми и пробелами внутри кавычек. Я должен справиться с этим, чтобы:
x = ["A", "B", "C", "D"]
в Python.
Я знаю , что может лишить пространства с strip()
и с split()
помощью разделения оператора и проверок для не алфавитов. Но код становился очень грязным. Есть ли быстрая функция, о которой я не знаю?
Ответы:
ast.literal_eval :
источник
eval
, нетast.literal_eval
.ast.literal_eval
это безопаснее , чемeval
, но это на самом деле не безопасно . Как объясняется в последних версиях документации : «Предупреждение. Возможно, сбой интерпретатора Python с достаточно большой / сложной строкой из-за ограничений глубины стека в компиляторе Python AST». На самом деле, возможно, можно выполнить произвольный код с помощью осторожной атаки с разбивкой стека, хотя, насколько я знаю, никто не создает публичного доказательства концепции для этого.json
Модуль является лучшим решением , когда есть строковой список словарей.json.loads(your_data)
Функция может быть использована для преобразования его в список.по аналогии
источник
'["a","b"]'
но не для"['a','b']"
.Это
eval
опасно - вы не должны выполнять пользовательский ввод.Если у вас 2.6 или новее, используйте ast вместо eval:
Как только у вас есть это,
strip
строки.Если вы используете более старую версию Python, вы можете получить очень близко к желаемому с помощью простого регулярного выражения:
Это не так хорошо, как решение ast, например, оно неправильно обрабатывает экранированные кавычки в строках. Но это просто, не требует опасного eval, и может быть достаточно для вашей цели, если вы на старом Python без ast.
источник
eval
Опасно - вы не должны выполнять ввод пользователя»? Я использую 3,6eval
напрямую, он оценит любое допустимое выражение Python, которое потенциально опасно.literal_eval
решает эту проблему, оценивая только литеральные структуры Python: строки, числа, кортежи, списки, dicts, booleans и None.источник
Есть быстрое решение:
Нежелательные пробелы в элементах списка могут быть удалены следующим образом:
источник
Вдохновленный некоторыми ответами выше, которые работают с базовыми пакетами Python, я сравнил производительность нескольких (используя Python 3.7.3):
Способ 1: аст
Способ 2: JSON
Способ 3: нет импорта
Я был разочарован, когда увидел, что метод с наихудшей читаемостью - это метод с наилучшей производительностью ... при выборе наиболее удобочитаемой опции нужно учитывать компромиссы ... для типов рабочих нагрузок, для которых я обычно использую python Значение читабельности по сравнению с чуть более производительным вариантом, но, как обычно, зависит.
источник
Если это только одномерный список, это можно сделать, ничего не импортируя:
источник
Предполагая, что все ваши входные данные являются списками и что двойные кавычки на входе фактически не имеют значения, это можно сделать с помощью простой замены регулярного выражения. Это немного странно, но работает как шарм. Также обратите внимание, что вывод теперь представляет собой список строк в Юникоде, вы не указали, что вам это нужно, но, похоже, имеет смысл вводить данные в Юникоде.
Переменная junkers содержит скомпилированное регулярное выражение (для скорости) всех символов, которые нам не нужны, используя] в качестве символа, требующего некоторой хитрости с обратной косой чертой. Re.sub заменяет все эти символы ничем, и мы разделяем полученную строку на запятые.
Обратите внимание, что при этом также удаляются пробелы внутри записей u '["oh no"]' ---> [u'ohno ']. Если это не то, что вы хотели, регулярное выражение нужно немного улучшить.
источник
Если вы знаете, что ваши списки содержат только строки в кавычках, этот пример разбора даст вам ваш список разделенных строк (даже с сохранением оригинальной Unicode-ness).
Если ваши списки могут иметь больше типов данных или даже содержать списки в списках, то вам понадобится более полная грамматика - такая, как эта в вики с pyparsing, которая будет обрабатывать кортежи, списки, целые числа, числа с плавающей запятой и строки в кавычках. Будет работать с версиями Python до 2.4.
источник
parsePythonValue.py
Пример теперь на GitHub в github.com/pyparsing/pyparsing/blob/master/examples/...Для дальнейшего завершения ответа @Ryan с использованием json, одна очень удобная функция для преобразования юникода - та, что размещена здесь: https://stackoverflow.com/a/13105359/7599285
например с двойными или одинарными кавычками:
источник
Я хотел бы предоставить более интуитивное решение для создания паттернов с помощью регулярных выражений. Приведенная ниже функция принимает в качестве входных данных строковый список, содержащий произвольные строки.
Пошаговое объяснение: Вы удаляете все пробелы, скобки и разделители-значения (при условии, что они не являются частью значений, которые вы хотите извлечь, в противном случае регулярное выражение становится более сложным). Затем вы разбиваете очищенную строку на одинарные или двойные кавычки и принимаете непустые значения (или нечетные индексированные значения, независимо от предпочтения).
тестовый образец : "['21'," foo "'6', '0'," A "]"
источник
и с чистым питоном - не импортировать библиотеки
источник
Вы можете столкнуться с такой проблемой, когда имеете дело с очищенными данными, хранящимися в Pandas DataFrame.
Это решение работает как шарм, если список значений представлен в виде текста .
источник
Итак, следуя всем ответам, я решил выбрать наиболее распространенные методы:
Итак, в конце концов, регулярное выражение побеждает!
источник
Вы можете сохранить себя .strip () fcn, просто вырезав первый и последний символы из строкового представления списка (см. третью строку ниже)
источник